Wiita

自分にとってのメモと, プログラミングに関する情報を発信していきます. サイト名の意味は特にありません.

seed_fu使ってシードデータを作ったのにrspecのテストを回すとシードデータが消えている

rspec使ったテストを書き始めたので,github actionsでのCI環境でもテストを回るようにしたところ...

rspecを実行するとシードデータが消えていることがわかりました.

原因

spec/rails_helper.rb にある以下の記述が原因みたいです.

これはテストが始まる時にmigrationがちゃんとできてるかどうか確認してデータベースのスキーマをschema.rbに合わせるみたいです. もしmigrationを行う場合,DBを綺麗に消しちゃうみたいで,それによってseed作っても消えちゃってた様です.

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end

解決策1: seedをrspec実行時に作るようにする

spec/spec_helper.rb に以下を追記するとよいです. config.before(:suite)rspecを実行する前に1回だけ行う処理をかけるみたいです.

RSpec.configure do |config|
  ...
  config.before(:suite) do
      SeedFu.seed
  end
  ...
end

解決策2: Seedを作っても消えないようにする

ActiveRecord::Migration.maintain_test_schema! を無効にします.

config/environment/test.rb に以下の1行を追加します.

config.active_record.maintain_test_schema = false

この場合,migrationをRAILS_ENV=test と指定して回す必要もあります. CIなどの一連の流れはこのような感じに(github actionsなどではもっと楽にenv を指定するだけでOKです)

RAILS_ENV=test rails db:setup
RAILS_ENV=test  rails db:seed_fu
RAILS_ENV=test  bundle exec rspec

参考

katsuyukikun.hatenablog.com

qiita.com