A test double is an object that stands in for a real object during testing. It helps isolate the code being tested by mimicking the behavior of real objects.
Click to reveal answer
beginner
Name four common types of test doubles.
The four common types are: Dummy, Stub, Mock, and Spy. Each serves a different purpose in testing.
Click to reveal answer
intermediate
What is the difference between a stub and a mock?
A stub provides predefined responses to method calls but does not check if the method was called. A mock also sets expectations and verifies if certain methods were called during the test.
Click to reveal answer
intermediate
How does a spy differ from a mock in Ruby testing?
A spy records information about how it was called but does not fail the test if expectations are not met. A mock sets expectations and fails the test if they are not met.
Click to reveal answer
beginner
Why use test doubles in unit testing?
Test doubles help isolate the unit of code by replacing dependencies. This makes tests faster, more reliable, and focused on the code being tested.
Click to reveal answer
Which test double provides canned responses but does not verify method calls?
ASpy
BMock
CDummy
DStub
✗ Incorrect
A stub returns predefined responses but does not check if the method was called.
What type of test double fails a test if expected methods are not called?
AMock
BSpy
CDummy
DStub
✗ Incorrect
Mocks set expectations and fail the test if those expectations are not met.
Which test double is mainly used to fill parameter lists but has no behavior?
ASpy
BDummy
CStub
DMock
✗ Incorrect
Dummies are simple objects passed around but never actually used.
In Ruby testing, what does a spy do?
ARecords method calls without failing tests if expectations are not met
BProvides canned responses and fails tests if methods are not called
CReplaces objects with no behavior
DMocks external services
✗ Incorrect
A spy records how it was called but does not fail the test if expectations are not met.
Why are test doubles useful in unit tests?
AThey make tests slower but more accurate
BThey automatically fix bugs
CThey isolate the code under test by replacing dependencies
DThey replace the need for real tests
✗ Incorrect
Test doubles isolate the code being tested by replacing its dependencies, making tests faster and more focused.
Explain the different types of test doubles and when you might use each.
Think about how each double behaves and what it checks during tests.
You got /5 concepts.
Describe why test doubles are important in unit testing and how they improve test quality.
Consider what happens if you test with real dependencies.
You got /4 concepts.
Practice
(1/5)
1.
What is the main purpose of using test doubles in Ruby testing?
easy
A. To permanently change the behavior of classes
B. To speed up the program execution in production
C. To replace real objects with fake ones to isolate tests
D. To automatically generate user interface elements
Solution
Step 1: Understand what test doubles do
Test doubles are fake objects used in tests to replace real parts of the program.
Step 2: Identify the main goal
The goal is to isolate the part being tested by removing outside effects from real objects.
Final Answer:
To replace real objects with fake ones to isolate tests -> Option C
Quick Check:
Test doubles isolate tests = A [OK]
Hint: Test doubles fake objects to isolate tests quickly [OK]
Common Mistakes:
Thinking test doubles speed up production code
Believing test doubles permanently change classes
Confusing test doubles with UI tools
2.
Which of the following is the correct way to create a test double named user in Ruby using RSpec?
?
easy
A. user = fake('user')
B. user = double('user')
C. user = stub('user')
D. user = mock_object('user')
Solution
Step 1: Recall RSpec syntax for test doubles
RSpec uses the method double to create test doubles.
Step 2: Match the correct method call
The correct syntax is double('name'), so double('user') is right.
Final Answer:
user = double('user') -> Option B
Quick Check:
RSpec double creation = A [OK]
Hint: Use double('name') to create test doubles in RSpec [OK]
Common Mistakes:
Using fake or stub instead of double
Confusing mock_object with double
Missing quotes around the name
3.
What will be the output of this Ruby code using a test double?
user = double('user')
allow(user).to receive(:name).and_return('Alice')
puts user.name
medium
A. Alice
B. nil
C. user
D. NoMethodError
Solution
Step 1: Understand the double setup
The double user is told to respond to name with 'Alice'.
Step 2: Check the method call output
Calling user.name returns 'Alice' as set by and_return.
Final Answer:
Alice -> Option A
Quick Check:
Double returns stubbed value = C [OK]
Hint: Stub method with and_return to control output [OK]
Common Mistakes:
Expecting the double name instead of stubbed return
Thinking it returns nil by default
Assuming NoMethodError without stub
4.
Identify the error in this test double usage and how to fix it:
order = double('order')
allow(order).to receive(:total)
puts order.total
medium
A. Missing and_return causes order.total to return nil, fix by adding and_return
B. Double name should be a symbol, fix by using double(:order)
C. Cannot call allow on a double, fix by using expect
D. Missing puts before order.total
Solution
Step 1: Analyze the stub setup
The method total is allowed but no return value is set, so it returns nil.
Step 2: Fix by adding return value
Add and_return(value) to specify what total should return.
Final Answer:
Missing and_return causes order.total to return nil, fix by adding and_return -> Option A
Quick Check:
Stub needs return value = B [OK]
Hint: Always add and_return to stub methods for expected output [OK]
Common Mistakes:
Thinking double name must be symbol
Confusing allow with expect usage
Forgetting to print output
5.
You want to test a PaymentProcessor class that calls an external Gateway service. How can you use a test double to ensure your test does not call the real Gateway?
class PaymentProcessor
def initialize(gateway)
@gateway = gateway
end
def pay(amount)
@gateway.charge(amount)
end
end
# Test code here?
hard
A. Remove the gateway parameter and hardcode the call inside PaymentProcessor
B. Call the real Gateway class directly in the test
C. Use allow_any_instance_of(Gateway) to stub charge
D. Create a double for gateway that expects charge with amount and returns true
Solution
Step 1: Understand dependency injection
The PaymentProcessor takes a gateway object to call charge.
Step 2: Use a test double for gateway
Create a double that expects charge with the amount and returns true to simulate success.
Step 3: Avoid calling real external service
This prevents the test from calling the real Gateway, isolating the test.
Final Answer:
Create a double for gateway that expects charge with amount and returns true -> Option D
Quick Check:
Use doubles to isolate external calls = D [OK]
Hint: Inject doubles to replace external services in tests [OK]
Common Mistakes:
Calling real external services in tests
Hardcoding dependencies inside classes
Using allow_any_instance_of unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.