Bird
Raised Fist0
Rubyprogramming~5 mins

Test doubles concept in Ruby - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a test double in Ruby testing?
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
What type of test double fails a test if expected methods are not called?
AMock
BSpy
CDummy
DStub
Which test double is mainly used to fill parameter lists but has no behavior?
ASpy
BDummy
CStub
DMock
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
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
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

      1. Step 1: Understand what test doubles do

        Test doubles are fake objects used in tests to replace real parts of the program.
      2. Step 2: Identify the main goal

        The goal is to isolate the part being tested by removing outside effects from real objects.
      3. Final Answer:

        To replace real objects with fake ones to isolate tests -> Option C
      4. 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

      1. Step 1: Recall RSpec syntax for test doubles

        RSpec uses the method double to create test doubles.
      2. Step 2: Match the correct method call

        The correct syntax is double('name'), so double('user') is right.
      3. Final Answer:

        user = double('user') -> Option B
      4. 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

      1. Step 1: Understand the double setup

        The double user is told to respond to name with 'Alice'.
      2. Step 2: Check the method call output

        Calling user.name returns 'Alice' as set by and_return.
      3. Final Answer:

        Alice -> Option A
      4. 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

      1. Step 1: Analyze the stub setup

        The method total is allowed but no return value is set, so it returns nil.
      2. Step 2: Fix by adding return value

        Add and_return(value) to specify what total should return.
      3. Final Answer:

        Missing and_return causes order.total to return nil, fix by adding and_return -> Option A
      4. 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

      1. Step 1: Understand dependency injection

        The PaymentProcessor takes a gateway object to call charge.
      2. Step 2: Use a test double for gateway

        Create a double that expects charge with the amount and returns true to simulate success.
      3. Step 3: Avoid calling real external service

        This prevents the test from calling the real Gateway, isolating the test.
      4. Final Answer:

        Create a double for gateway that expects charge with amount and returns true -> Option D
      5. 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 unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard