rosh-1228のメモ

自身の勉強したことをメモしてます。

日時をテストするときは、travel_toメソッドを使うと良い

モデルテストで日時をテストするときに、以下のように今日作成されたものかどうかを確認するテストを作成していた。

report = Report.create(title: 'test_title', content: 'test_content')

assert_match Time.zone.today.to_s, report.created_at.to_date.to_s

ただ、これだとReport.createが実施された時間が23:59:59.999で、assert_matchでテストした時間が24:00:00.000とかになると、日を跨いでしまい、エラーになる可能性がある。

そこで、travel_toを使うと、日時を固定できるので便利だった。

travel_to(Date.new(2022, 1, 1)) do
      report = Report.create(title: 'test_title', content: 'test_content') # <=2022/01/01で固定される
      assert_equal Date.new(2022, 1, 1).to_s, report.created_at.to_date.to_s
    end

travel_to do ~ end の中でreportを作成して、assertionで結果を確認すれば、いつテストを行っても、日が固定されているので、日を跨いだらテストにならないといったことは心配なくなる。

【参考】

ActiveSupport::Testing::TimeHelpers

Timecopを使わなくても時間を止められた話