環境
- rails 5.2
やりたいこと
RSpecでいろいろテストを書いているのだが、日時が絡むテストが非常に面倒である。例えば一定時間経つと挙動が変わるとか、〜年より前、後で振る舞いが変わるテスト、など。
が、さすがRails、travel_toというヘルパーメソッドがあった。
何ができるのかというと、現在時刻を偽装できる、つまりタイムトラベル。。。!
使い方
デフォルトでは使えないのでインクルードする。rails_helper.rbに以下追記
RSpec.configure do |config| config.include ActiveSupport::Testing::TimeHelpers end
で、以下のように使える。
require 'rails_helper' RSpec.describe User, type: :model do describe "2015年の時" do it "2015年になっていること" do travel_to Date.new(2015,1,1) do expect(Date.current).to eq '2015-01-01'.to_date end end end end
実はブロックで区切らなくてもit抜けた時点でトラベルから戻ってこれる(現在時刻になる)
describe "2015年の時" do it "2015年になっていること" do travel_to Date.new(2016,1,1) expect(Date.current).to eq '2016-01-01'.to_date end end describe "30分後のとき" do it "30分後になっていること" do now1 = Time.now travel_to 30.minutes.after do now2 = Time.now expect(now2-now1 >= 30).to eq true end end end end
仕組み
ソースコード追おうと思ったけど先人の方がいらっしゃったのでリンクだけ(
参考リンク
見てるとrails4.1以降で使えるようなので、どのRailsでも使えるという認識でいいのでは