Timecop Gotcha

Timecop is an extremely useful gem which allows you to simulate the passing of time in RSpec tests. We’re using it to test parts of Citrulu – for example, making sure we don’t send you multiple emails about the same thing.

One of our tests has this shape:

it "should do some stuff!" do
  # do something
  Timecop.travel(Time.now + 5)
  # do something 5 seconds later
  Timecop.travel(Time.now + 10)
  # do something 10 seconds later

  result.should be_awesome

When running the test I noticed the following line in the output:

15.74 seconds ./spec/lib/my_awesome_spec.rb:118

Over 15 seconds to run the spec?
Clearly the elapsed time is calculated based on timestamps which are affected by the TimeCop travel statements. Adding Timecop.return() at the end of the script fixes this by resetting the test time to the system time:

0.71269 seconds ./spec/lib/my_awesome_spec.rb:118

Much more plausible 🙂