RSpecで現在の時刻を意図的に指定してテストする方法
テストコードを書いていると、現在の時刻がインプットになるケースが割とよくある。
午前中は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円オーバーとか、信じられない
RSpecに関する他の記事を読む
- GitHub ActionsでRSpecを実行するサンプル(with PostgreSQL)
- RSpecでテストデータが大きくてコードが見ずらい対策にfixtureを使う
- RSpecをセットアップする
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら