I recently ran into a problem with a test suite in a Rails application which had me stumped for a while. To sum up briefly a group of test suddenly started failing. What had happened was that Timecop was being set globally and wasn't being reset. This caused problems when a couple of weeks later the tests were run and the times were different to what they were expecting. Although the final solution is very simplistic
One way to fix the test suite would have been to use Timecop's block syntax, for example:
it "should mark the sprint as in the past" do Timecop.freeze(Date.today + 30) do sprint.should be_past end end
However I'm not a great fan of this syntax in my tests, I prefer my tests to be more procedural. It also prevents you from stubbing the time in a before block for a group of tests.
Spec::Runner.configure do |config| config.after(:each) do Timecop.return end end