RSpecセットアップ
RSpec 3.10.0、RSpec Rails 4.0.2、Fuubar 2.5.1、factory_bot 6.1.0、factory_bot_rails 6.1.0、spring-commands-rspec 1.0.4で確認。
以下のGemをインストールする。
group :development, :test do
# Fixture
gem 'factory_bot_rails'
# テストの進捗をプログレスバーで表示するgem
gem 'fuubar'
gem 'rspec-rails', '~> 4.0.2'
end
group :development do
# RSpecの起動高速化のために必要
gem 'spring-commands-rspec'
end
bin/rails generate rspec:install
でセットアップする。不要なので、minitestのtest
ディレクトリは削除しておく。
spec/rails_helper.rb
のRSpec.configure
のブロック内に以下のように追記する。
RSpec.configure do |config|
# 省略...
# travel_to('2021-1-1 00:00:00') { 指定時間に時間停止させて実行したいテスト }
# freeze_time { 時間停止させて実行したいテスト }
# などで時間を止めてテストができる
config.include ActiveSupport::Testing::TimeHelpers
# FactoryBotのメソッドをクラスを省略して呼べるようにする
config.include FactoryBot::Syntax::Methods
end
.rspec
ファイルを以下の内容にする。
--require spec_helper
--format Fuubar
--order rand
--seed <%= rand(1..100000) %>
--color
bin/spring binstub rspec
を実行しbin/rspec
ファイルを作る。SpringによってRailsのコード読み込みがキャッシュされるためRSpecの起動が速くなる。bundle exec rspec
とbin/rspec
で「Finished in n.nn seconds (files took N.NN seconds to load)」の表示を比べてみるとよくわかる(手元の環境ではfile loadに5秒ぐらいの差がでる)。
Springと連携している場合、--order rand
を指定してもseedが固定されてしまうので--seed <%= rand(1..100000) %>
を指定してseed値がランダムになるように指定する必要がある。