Timecop.freeze without Timecop.return is the textbook RSpec time bomb
Blog post from Mergify
In software testing, particularly with the RSpec framework for Rails applications, issues can arise when the Timecop tool is used to freeze time without properly resetting it, leading to time-related test failures across unrelated specs. This occurs because Timecop's side-effecting form requires a manual reset with Timecop.return, and if this is missed, the frozen state persists, causing discrepancies in assertions that depend on the current time. The recommended solution for Rails apps is to switch to ActiveSupport::Testing::TimeHelpers, which offers a block form that automatically resets time, reducing the likelihood of such failures. For non-Rails applications or older Rails versions, using Timecop's block form alongside a global reset hook can mitigate these issues. Additionally, injecting time dependencies directly into production code enhances testability and reduces reliance on global state changes. Tools like Mergify can help identify and manage these time-leak failures by tracking test order and surfacing patterns, ensuring that tests remain reliable and maintainable.