RailsのRSpecの初期設定を毎回既存のプロジェクトからコピーしてくるのが億劫になってきましたので、メモしておきます。
インストール
Gemfile
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'rails-controller-testing'
end
$ bundle exec rails generate rspec:install
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
- テスト
$ bundle exec rspec
No examples found.
Randomized with seed 34242
Finished in 0.00111 seconds (files took 0.64233 seconds to load)
0 examples, 0 failures
Randomized with seed 34242
便利設定
- 出力結果を見やすくする
.rspec
--require spec_helper
--format documentation
- spec/support以下のファイルの読み込みができるようにする
spec/rails_helper
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } # コメントアウトを外す
- TEST DBへMigrationを掛けていないときに自動でMigrationするのではなく、アラートを表示
spec/rails_helper
ActiveRecord::Migration.check_pending!
# begin
# ActiveRecord::Migration.maintain_test_schema!
# rescue ActiveRecord::PendingMigrationError => e
# puts e.to_s.strip
# exit 1
# end
$ bundle exec rspec
・・・
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=test
- Factory_botのメソッドの名前空間の省略
spec/support/factory_bot.rb
RSpec.configure do |config|
config.include include FactoryBot::Syntax::Methods
end
seeds.rb
require 'factory_bot'
include FactoryBot::Syntax::Methods
FactoryBot.definition_file_paths = [ Rails.root.join('spec', 'factories') ]
FactoryBot.reload
user = create(:user) # FactoryBot.create(:user)でなくてOK
- 現在時刻の時間をずらす(travel_to)
spec/rails_helper
config.include ActiveSupport::Testing::TimeHelpers # 追記
decsribe "Time.current" do
it do
travel_to('2018-12-16 8:00'.to_time) do
expect(Time.current).to eq(Time.new(2018, 3, 10, 8, 0, 0))
end
end
end
- テスト実行毎にデータベースを初期化する
Gemfile
group :test do
gem 'database_rewinder'
end
spec/support/factory_bot.rb
RSpec.configure do |config|
config.before(:suite) do
DatabaseRewinder.clean_all
end
config.after(:each) do
DatabaseRewinder.clean
end
end
- テストの順番をランダムにする
spec/spec_helper.rb
config.order = :random # 最終行に追加
- 同じ順番を再現したい場合
$ bundle exec rspec
・・・
Randomized with seed 14925
$ rspec -fd --order rand:14925 # 実行結果のseedの番号を指定
- テストを自動化する(guard)
Gemfile
group :development, :test do
gem 'guard-rspec', require: false
end
$ bundle
$ bundle exec guard init rspec
$ bundle exec guard