はじめに
Rails 6 に追加されそうな新機能を試す第24段。 今回のちょい足し機能は、 unfreeze_time
編です。
Rails 6.0 では、 travel_back
の alias として、 unfreeze_time
が追加されました。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
せっかくなので、RSpec をインストールして試してみたいと思います。
$ rails --version
Rails 6.0.0.rc1
Rails プロジェクトを作る
rspec を使うので、 -T
オプションをつけます。
$ rails new rails6_0_0rc1 -T
$ cd rails6_0_0rc1
db:create をしておく
$ bin/rails db:create
Gemfile に rspec-rails
を追加する
Gemfile に rspec-rails
を追加します。
...
group :development, :test do
gem 'rspec-rails'
end
...
bundle を実行
$ bundle
RSpec の初期設定をする
$ rails g rspec:install
spec で unfreeze_time
を使えるようにする
spec で unfreeze_time
を使えるように ActiveSupport::Testing::TimeHelpers を include します。
RSpec.configure do |config|
...
require 'active_support/testing/time_helpers'
config.include ActiveSupport::Testing::TimeHelpers
...
end
unfreeze_time を使った spec を書く
本来は、model とか何かしらのクラスやメソッドをテストするための spec なのですが、今回は spec だけで完結させることにしました。
before
内で freeze_time
を実行し、 after
内で unfreeze_time
を実行する場合と、実行しない場合を書いてみました。
require 'rails_helper'
RSpec.describe 'try to use unfreeze_time' do
context 'when using freeze_time and unfreeze_time' do
before :each do
freeze_time
end
after :each do
unfreeze_time
end
it 'time freezed' do
t1 = Time.zone.now
sleep 1
expect(Time.zone.now).to eq t1
end
end
context 'when without freeze_time and unfreeze_time' do
it 'time not freezed' do
t1 = Time.zone.now
sleep 1
expect(Time.zone.now).to be > t1
end
end
end
spec を実行する
spec を実行するとオールグリーンになります。
$ bundle exec rspec -fd
try to use unfreeze_time
when using freeze_time and unfreeze_time
time freezed
when without freeze_time and unfreeze_time
time not freezed
Finished in 2.01 seconds (files took 2.01 seconds to load)
2 examples, 0 failures
alias であることを確認する
オマケですが、 unfreeze_time
が travel_back
の別名であることを確認しておきます。
$ irb -ractive_support/testing/time_helpers
irb(main):001:0> ActiveSupport::Testing::TimeHelpers.instance_method(:unfreeze_time).original_name
=> :travel_back
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try024_unfreeze_time