2021-06-24 ActiveSupport::Testing::TimeHelpers でテスト実行時の時刻を自在に操る
ActiveSupport::Testing::TimeHelpers | RailsDoc(β)
現在時刻で固定
freeze_time
を使う。
freeze_time(&block)
Calls
travel_to
withTime.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株式会社