📖 Scenario: You are writing tests for a simple Ruby method that calculates the square of a number. Testing helps you check if your code works as expected before using it in real projects.
🎯 Goal: Build a basic RSpec test suite using expectations and matchers to verify that a square method returns correct results for given inputs.
📋 What You'll Learn
Create a Ruby method called square that returns the square of a number
Write an RSpec test file with a describe block for the square method
Use expect with the eq matcher to check the output for input 3
Add a test using the be_a matcher to confirm the output is an Integer
Use the not_to matcher to verify the output is not zero for input 5
💡 Why This Matters
🌍 Real World
Testing code with RSpec is common in Ruby projects to catch bugs early and ensure code quality.
💼 Career
Many Ruby developer jobs require writing and understanding RSpec tests to maintain reliable software.
Progress0 / 4 steps
1
Create the square method
Write a Ruby method called square that takes one parameter n and returns n * n.
Ruby
Hint
Define a method with def and return the number multiplied by itself.
2
Set up RSpec describe block
Write an RSpec describe block for the square method. Inside it, write an it block with description 'returns the square of a number'.
Ruby
Hint
Use RSpec.describe 'square' do and inside it an it block with the given description.
3
Add expectation with eq matcher
Inside the it block, write an expectation using expect(square(3)) and the eq(9) matcher to check the output.
Ruby
Hint
Use expect with the method call and to eq(9) to check the result.
4
Add more matchers and print test results
Add two more tests inside the describe block: one using expect(square(4)).to be_a(Integer) to check the output type, and another using expect(square(5)).not_to eq(0) to confirm the output is not zero. Then run the tests to see the results.
Ruby
Hint
Use be_a(Integer) matcher to check type and not_to eq(0) to check value is not zero.
Practice
(1/5)
1. What does the RSpec matcher expect(value).to eq(5) check for?
easy
A. It checks if value is less than 5.
B. It checks if value is greater than 5.
C. It checks if value is not equal to 5.
D. It checks if value is equal to 5.
Solution
Step 1: Understand the eq matcher
The eq matcher tests for equality between the expected and actual values.
Step 2: Analyze the expectation
expect(value).to eq(5) means the test expects value to be exactly 5.
Final Answer:
It checks if value is equal to 5. -> Option D
Quick Check:
eq matcher = equality check [OK]
Hint: Remember eq means exact equality check [OK]
Common Mistakes:
Confusing eq with greater_than or less_than
Thinking eq checks for inequality
Mixing up expect().to and expect().not_to
2. Which of the following is the correct syntax to check that an array includes the number 3 in RSpec?
easy
A. expect(array).to has(3)
B. expect(array).to include(3)
C. expect(array).to contains(3)
D. expect(array).to has_key(3)
Solution
Step 1: Identify the correct matcher for inclusion
The include matcher checks if a collection contains a specific element.
Step 2: Match syntax with RSpec standards
expect(array).to include(3) is the correct syntax to check if 3 is in the array.
Final Answer:
expect(array).to include(3) -> Option B
Quick Check:
include matcher = check element presence [OK]
Hint: Use include to check if collection has an element [OK]
Common Mistakes:
Using has or contains which are not valid RSpec matchers
Using has_key which is for hashes, not arrays
Forgetting to use expect().to syntax
3. What will be the output of this RSpec test snippet?
describe 'Number test' do
it 'checks if number is odd' do
number = 7
expect(number.odd?).to be true
end
end
medium
A. The test passes because 7 is odd.
B. The test fails because 7 is not odd.
C. SyntaxError due to incorrect matcher usage.
D. The test passes but warns about deprecated syntax.
Solution
Step 1: Understand the code logic
The variable number is set to 7, which is an odd number.
Step 2: Analyze the expectation
expect(number.odd?).to be true checks if number.odd? returns true, which it does for 7.
Final Answer:
The test passes because 7 is odd. -> Option A
Quick Check:
odd? returns true for odd numbers [OK]
Hint: odd? returns true for odd numbers, expect that [OK]
Common Mistakes:
Assuming 7 is even
Confusing be true with eq true
Thinking syntax is wrong here
4. Identify the error in this RSpec expectation:
expect(user.name).to eq nil
medium
A. Should use not_to eq nil to check for nil.
B. Missing parentheses around eq(nil).
C. Should use be_nil matcher instead of eq nil.
D. No error; the syntax is correct.
Solution
Step 1: Understand nil checking in RSpec
While eq nil works, the preferred matcher for nil is be_nil for clarity and style.
Step 2: Identify best practice
Using expect(user.name).to be_nil is clearer and idiomatic in RSpec.
Final Answer:
Should use be_nil matcher instead of eq nil. -> Option C
Quick Check:
Use be_nil for nil checks [OK]
Hint: Use be_nil matcher for nil checks, not eq nil [OK]
Common Mistakes:
Thinking eq nil is a syntax error
Adding unnecessary parentheses
Using not_to eq nil to check for nil
5. You want to test that a method calculate returns a value greater than 10 but less than 20. Which RSpec expectation correctly checks this?
hard
A. expect(calculate).to satisfy { |v| v > 10 && v < 20 }
B. expect(calculate).to be > 10 and be < 20
C. expect(calculate).to be_between(10, 20).exclusive
D. expect(calculate).to be_between(11, 19).inclusive
Solution
Step 1: Understand the range requirement
The value must be greater than 10 and less than 20, excluding 10 and 20 themselves.
Step 2: Analyze each option
expect(calculate).to be > 10 and be < 20: expect(calculate).to be > 10 and be < 20 is invalid syntax; correct chaining uses (be > 10).and(be < 20). Options C and D: be_between is not a built-in RSpec matcher. expect(calculate).to satisfy { |v| v > 10 && v < 20 }: expect(calculate).to satisfy { |v| v > 10 && v < 20 } correctly checks the condition using a standard flexible matcher.
Step 3: Choose the best matcher
expect(calculate).to satisfy { |v| v > 10 && v < 20 } is the correct and explicit choice using standard RSpec.
Final Answer:
expect(calculate).to satisfy { |v| v > 10 && v < 20 } -> Option A
Quick Check:
satisfy matcher = custom condition check [OK]
Hint: Use satisfy with block for complex conditions [OK]
Common Mistakes:
Using non-standard be_between matcher
Trying to chain matchers with 'and' incorrectly
Ignoring boundary conditions in range checks
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.