動かざることバグの如し

近づきたいよ 君の理想に

RSpecで現在時刻を変更してテストしたいときはtravel_toが便利

環境

やりたいこと

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でも使えるという認識でいいのでは