今までRspecを使うときは、漫然と先人のコードをコピペして、設定をrails_helper.rbに書いたりspec_helper.rbに書いたりしていましたが、「rails_helper.rbにだけ書けばよい」という結論に至りました。
次のStack Overflowの回答を参照。spec_helper.rbは、Railsを読み込まずにRspecだけで何かしらRubyのコードをテストするのに使うらしい。
Rspecが生成するrails_helper.rbのテンプレートの先頭は次のようになってます。まず、spec_helper.rbを読み込み、その後でRails(config/environment
)を読み込みます。
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
テストスクリプトの先頭でrails_helper.rbを読み込めば、RailsとRspecが使えます。
require 'rails_helper'
代わりにspec_helper.rbを読み込めば、RailsなしでRspecが使えます。
require 'spec_helper'
といっても、普通のRailsアプリケーションで、Railsを使わずにテストをする、というケースは考えにくい。なら、rails_helper.rbにだけ設定をまとめたほうが分かりやすくていいんじゃないでしょうか(spec_helper.rbのほうは自動生成されたものを放置すればいい)。
今いじっているプロジェクトのrails_helper.rbは次のような感じにしました(長いコメントは除く)。
# simplecovは最初に
require 'simplecov'
SimpleCov.start 'rails'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# spec/supportの下読み込み
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
# Capybara設定
Capybara.server = :puma, { Silent: true }
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
RSpec.configure do |config|
# FactoryBotのメソッド使う
config.include FactoryBot::Syntax::Methods
# DBきれいにする
config.before :suite do
DatabaseRewinder.clean_all
end
# system specでheadless chrome使う
config.before(:each) do |example|
if example.metadata[:type] == :system
driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
end
end
# config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
config.filter_rails_from_backtrace!
end