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.rbRSpec.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 rspecbin/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値がランダムになるように指定する必要がある。