Bird
Raised Fist0
Rubyprogramming~20 mins

Mocking and stubbing in Ruby - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Mocking and Stubbing Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Ruby mocking code?

Consider the following Ruby code using RSpec mocks. What will be printed when this code runs?

Ruby
class User
  def name
    "Alice"
  end
end

user = User.new
allow(user).to receive(:name).and_return("Bob")
puts user.name
AAlice
BRuntimeError
Cnil
DBob
Attempts:
2 left
💡 Hint

Think about what allow(...).to receive(...).and_return(...) does to the method.

❓ Predict Output
intermediate
2:00remaining
What error does this Ruby stub code raise?

What error will this Ruby code raise when run?

Ruby
class Calculator
  def add(a, b)
    a + b
  end
end

calc = Calculator.new
allow(calc).to receive(:add).with(1, 2).and_return(5)
puts calc.add(2, 3)
A5
B5.0
C3
DRSpec::Mocks::MockExpectationError
Attempts:
2 left
💡 Hint

Check what arguments the stub expects and what arguments are actually passed.

🔧 Debug
advanced
2:00remaining
Why does this stub not work as expected?

Look at this Ruby code snippet using RSpec mocks. Why does the stub not change the method output?

Ruby
class Dog
  def bark
    "woof"
  end
end

dog = Dog.new
allow(Dog).to receive(:bark).and_return("meow")
puts dog.bark
ABecause <code>allow</code> was called on the class, not the instance
BBecause <code>allow</code> cannot stub methods that return strings
CBecause <code>dog.bark</code> is a private method
DBecause <code>allow</code> requires a block to work
Attempts:
2 left
💡 Hint

Think about the difference between stubbing a class method and an instance method.

❓ Predict Output
advanced
2:00remaining
What is the output of this chained stub in Ruby?

What will this Ruby code print?

Ruby
class Car
  def engine
    Engine.new
  end
end

class Engine
  def start
    "vroom"
  end
end

car = Car.new
allow(car).to receive_message_chain(:engine, :start).and_return("silent")
puts car.engine.start
Asilent
Bvroom
CNoMethodError
Dnil
Attempts:
2 left
💡 Hint

Look at what receive_message_chain does.

❓ Predict Output
expert
2:00remaining
What is the value of the variable after this stubbed method call?

Given the following Ruby code, what is the value of result after execution?

Ruby
class Service
  def fetch_data
    {status: 200, body: "data"}
  end
end

service = Service.new
allow(service).to receive(:fetch_data).and_return({status: 404, body: "not found"})
result = service.fetch_data[:status]
A200
B404
C"data"
Dnil
Attempts:
2 left
💡 Hint

Remember what the stub changes the method to return.

Practice

(1/5)
1. What is the main purpose of stubbing in Ruby testing?
easy
A. To check if a method was called with specific arguments
B. To slow down tests by adding delays
C. To run the actual method code during tests
D. To replace a method's return value with a fake one

Solution

  1. Step 1: Understand stubbing concept

    Stubbing means replacing a method's output with a fake value to control test behavior.
  2. Step 2: Differentiate from mocking

    Mocking checks method calls, but stubbing focuses on return values.
  3. Final Answer:

    To replace a method's return value with a fake one -> Option D
  4. Quick Check:

    Stubbing = fake return value [OK]
Hint: Stubs fake returns; mocks check calls [OK]
Common Mistakes:
  • Confusing stubs with mocks
  • Thinking stubs run real code
  • Believing stubs slow tests
2. Which of the following is the correct syntax to stub a method foo on an object obj to return 42 using RSpec?
easy
A. allow(obj).to receive(:foo).and_return(42)
B. expect(obj).to stub(:foo).and_return(42)
C. obj.stub(:foo).returns(42)
D. mock(obj).expects(:foo).returns(42)

Solution

  1. Step 1: Recall RSpec stubbing syntax

    In RSpec, stubbing uses allow(object).to receive(:method).and_return(value).
  2. Step 2: Check each option

    allow(obj).to receive(:foo).and_return(42) matches correct syntax; others use outdated or incorrect methods.
  3. Final Answer:

    allow(obj).to receive(:foo).and_return(42) -> Option A
  4. Quick Check:

    RSpec stub = allow + receive + and_return [OK]
Hint: Use allow(obj).to receive(:method).and_return(value) [OK]
Common Mistakes:
  • Using deprecated stub syntax
  • Confusing expect with allow for stubs
  • Using mock instead of allow for stubs
3. What will be the output of this Ruby code using RSpec mocks?
class Calculator
  def add(a, b)
    a + b
  end
end

calc = Calculator.new
allow(calc).to receive(:add).with(2, 3).and_return(10)
puts calc.add(2, 3)
puts calc.add(4, 5)
medium
A. 10 10
B. 10 9
C. 5 9
D. 5 5

Solution

  1. Step 1: Analyze stubbed method call

    The method add is stubbed to return 10 only when called with arguments 2 and 3.
  2. Step 2: Check calls and outputs

    First call calc.add(2, 3) returns 10 due to stub. Second call calc.add(4, 5) is not stubbed, so runs original method returning 9.
  3. Final Answer:

    10 9 -> Option B
  4. Quick Check:

    Stubbed args return 10; others run real method [OK]
Hint: Stub affects only specified arguments [OK]
Common Mistakes:
  • Assuming all calls return stub value
  • Ignoring method arguments in stub
  • Expecting syntax error
4. Identify the error in this RSpec mocking code:
user = double('User')
expect(user).to receive(:login).with('admin')
user.login('guest')
medium
A. Missing stub for login method
B. The double is not created correctly
C. The method login is called with wrong argument
D. No error, code is correct

Solution

  1. Step 1: Understand the expectation

    The test expects login to be called with argument 'admin'.
  2. Step 2: Check actual method call

    The method is called with 'guest', which does not match the expectation.
  3. Final Answer:

    The method login is called with wrong argument -> Option C
  4. Quick Check:

    Expect argument mismatch causes failure [OK]
Hint: Match expected arguments exactly in mocks [OK]
Common Mistakes:
  • Calling method with different arguments
  • Confusing stub and expect syntax
  • Ignoring error raised by RSpec
5. You want to test a method that calls an external API method fetch_data on a Service object. How can you use mocking and stubbing together to test your method without calling the real API?
hard
A. Stub fetch_data to return fake data and mock to check it was called once
B. Call the real fetch_data method and ignore mocking
C. Mock fetch_data without stubbing its return value
D. Do not use mocking or stubbing; test with real API

Solution

  1. Step 1: Stub the API call to avoid real network

    Stub fetch_data to return controlled fake data, so tests run fast and reliably.
  2. Step 2: Mock to verify the method call

    Use mock to check fetch_data was called exactly once, ensuring your method triggers it.
  3. Final Answer:

    Stub fetch_data to return fake data and mock to check it was called once -> Option A
  4. Quick Check:

    Stub return + mock call count = test isolation [OK]
Hint: Stub return and mock call count together [OK]
Common Mistakes:
  • Calling real API in tests
  • Mocking without stubbing return value
  • Ignoring call verification
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