テストコードを書いていると、現在の時刻がインプットになるケースが割とよくある。

午前中はxxxと表示したい、とか年跨ぎの処理がちゃんと動作するかなどなど。

そんなときはspec/rails_helper.rbに以下を追記。

RSpec.configure do |config|
  
  # 省略〜
  
  # 時刻を任意の指定してのテストができるように追記
  config.include ActiveSupport::Testing::TimeHelpers
end

そして、テストコードの中で以下のように設定すると指定した時刻を現在時刻としてテストコードを動作させることができる。

指定時刻の部分はletで定義して条件で変えるとかもできるので、使い勝手がいい。

describe '#hoge' do
  around do |e|
    travel_to('2022-12-14 12:30:40') { e.run }
  end

  it 'テスト' do
    # 検証内容
  end
end

ただし、データベースの中でNOW()なんかを使ってタイムスタンプを発行していて、それがテストに関係している場合はこのやり方ではできない。

以前は時刻の調整といえば、timecopというgemをよく使っていたけれど、今はもうrailsのデフォルトで組み込まれているようだ。

この記事の環境情報

  • RSpec 3.11.0
  • スコッチ高くなった。グレンモーレンジ10年で4,000円オーバーとか、信じられない