ActiveSupport::Testing::TimeHelpers | RailsDoc(β)

現在時刻で固定

freeze_time を使う。

freeze_time(&block)

Calls travel_to with Time.now.

任意の時刻に固定

travel_to を使う。

travel_to(date_or_time)

Changes current time to the given time by stubbing Time.now, Date.today, and DateTime.now to return the time or date passed into this method. The stubs are automatically removed at the end of the test.

travel_to Time.zone.local(2004, 11, 24, 01, 04, 44) do
  Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
end

昔話

昔はこの手のことをするのに travisjeffery/timecopというgemを使っていた。

今は Rails 標準のTimeHelpersが用意されてて便利ですね、という昔話。

テストで時間を止めたい時、Timecopを使わないと止められないと思っていましたが、Rails4.1以降は標準のActiveSupport::Testing::TimeHelpersでも止められると最近知りました。

Rails: Timecopを使わなくても時間を止められた話|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社