Ruby Testing
Ruby tests for vanilla Ruby or Ruby on Rails should use the rspec BDD test library.
There is currently a requirement for the workspace to contain a spec
folder at the root level.
There also needs to be a Gemfile
at the root level with the following contents: gem 'rspec', '3.1'
.
NB: There is older Ruby content that uses the Codex SCT
test type and a custom test runner. This should be avoided for future Ruby content.
Ruby test structure
- Ruby tests are written in rspec format with
describe
andit
blocks. If the test file finishes execution without raising an uncaught Error, the test passes.
Example Tests
# Use these lines to enable access to learner variables:
$b = binding
eval(File.read('./script.rb'), $b)
describe "script.rb" do
it "test case name..." do
# Test variable existence:
begin
# Attempt to access a learner variable
$b.eval('my_string')
rescue NameError
# If variable doesn't exist, deliberately raise a new error.
expect(1).to eq(0), "Define a variable named `my_string`."
end
# If no error is raised above, variable exists and can be
expect($b.eval('my_string')).to be_a(String), '`my_string` should be a String.'
end
end
This test intends to evaluate whether a learner has created a new variable (my_string
) and that is the correct type. The begin
-rescue
-end
pattern is a friendly way to provide specific feedback whether the learner
- has run tests without writing any code or with a misnamed variable (
"Define a variable named my_string."
) - has successfully created a variable but not of the right type (
"my_string should be a String."
)
If there are multiple variables to be tested in a single test, you can verify them in a single begin
-rescue
-end
group with the following pattern:
begin
$b.eval('var_one')
$b.eval('var_two')
rescue NameError => e
# extract the variable name from the NameError message:
message = e.message.match(/variable or method `([a-z_][a-zA-Z_0-9]*)/)
# The missing variable will be interpolated in the message to learners:
expect(1).to eq(0), "Define a variable called `#{message[1]}`."
end
Other Guidelines
- Actual code (real variable names, language syntax, etc. ) in feedback messages should be code-ticked (`)
- Ruby tests should follow Test standards.