Test doubles concept in Ruby - Time & Space Complexity
When using test doubles, we want to see how the time to run tests changes as the number of doubles grows.
We ask: How does adding more test doubles affect test execution time?
Analyze the time complexity of the following Ruby code using test doubles.
class OrderProcessor
def initialize(payment_gateway)
@payment_gateway = payment_gateway
end
def process(order)
@payment_gateway.charge(order.amount)
end
end
payment_double = double('PaymentGateway')
allow(payment_double).to receive(:charge).and_return(true)
processor = OrderProcessor.new(payment_double)
processor.process(order)
This code uses a test double to replace a real payment gateway in order processing.
Look for repeated calls or loops involving test doubles.
- Primary operation: Calling the double's method
charge. - How many times: Once per order processed, or once per test run.
As the number of test doubles or calls grows, the total calls to doubles grow linearly.
| Input Size (number of calls) | Approx. Operations |
|---|---|
| 10 | 10 calls to doubles |
| 100 | 100 calls to doubles |
| 1000 | 1000 calls to doubles |
Pattern observation: The number of operations grows directly with the number of calls.
Time Complexity: O(n)
This means the time to run tests grows in a straight line as you add more calls to test doubles.
[X] Wrong: "Test doubles make tests run instantly, no matter how many calls there are."
[OK] Correct: Each call to a double still takes time, so more calls mean more time, even if faster than real objects.
Understanding how test doubles affect test speed helps you write efficient tests and explain your choices clearly.
What if we replaced test doubles with real objects that perform network calls? How would the time complexity change?