今回はRSpecでテストを実行する際、seed_fuで作成したテストデータが削除されてしまう場合の対処方法について備忘録としてまとめたいと思います。RSpecでもseed_fuデータを使いたい場合は、これらの対応を頭に入れておく必要がありそうです。

RSpec実行時にデータが空になってしまう
001_users.rb
を作成しユーザーのテストデータを投入しましたが、RSpecでテストを実行した際、それらのユーザーデータが空になってしまいます。
# db/fixtures/001_users.rb
User.seed(:id, [
{ id: 1, email: 'hoge@example.com', password: 'Hoge1234!', name: '田中太郎', name_kana: 'タナカタロウ', phone_number: '09011112222' },
{ id: 2, email: 'hogehoge@example.com', password: 'HogeHoge1234!', name: '田中二郎', name_kana: 'タナカジロウ', phone_number: '08011112222' },
])
# ユーザーデータを投入
% rails db:seed_fu
# テストを実行すると作成したユーザーデータが空になってしまう
% rspec
> User.all
=> []
原因
spec/rails_helper.rb
にある以下の記述が原因で、作成したユーザーデータ(seed_fuのテストデータ)がクリアされてしまうようです。
# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
begin
ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
puts e.to_s.strip
exit 1
end
以下のコメントアウトで説明がされていました。
# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
テスト実行前に保留中のマイグレーションをチェックし、それらを適用します。ActiveRecordを使用しない場合は、以下の行を削除することが可能です。
簡単に言うと、テスト実行前にマイグレーションの整合性をチェックし、その際にDBを消去してしまいます。それによりseed_fuで作成したテストデータも削除されてしまったようです。
対処方法
before(:suite)
やbefore(:all)
を用いてテスト実行前にseed_fuのデータを入れるよう、spec/spec_helper.rb
に以下の記述を追記します。
RSpec.configure do |config|
config.before(:suite) do
SeedFu.quiet = true
SeedFu.seed
end
end
SeedFu.quiet = true
を記述することで、seedデータが読み込まれるログを非表示にします。デフォルト(記述しない場合)ではSeedFu.quiet = false
になっており、テスト実行時にseedのログが表示されてしまいます。
特定のseedデータのみ読み込みたい場合は以下のようにも記述することができます。テストの実行時間にも影響するため、できるだけ対象のseedデータのみ読む込むよう設定した方が良さそうです。
RSpec.configure do |config|
config.before(:all) do
SeedFu.quiet = true
SeedFu.seed(Rails.root.join('spec/fixtures/001_users.rb'))
end
end

まとめ
- RSpec実行時にテストデータが削除されてしまう現象は、RSpecがテスト実行前に保留中のマイグレーションをチェックすることが原因
- spec/spec_helper.rbに
before(:suite)
やbefore(:all)
を用いてテスト前にデータを入れるようにすることで対処できる
参考
- mbleigh/seed-fu
- In RSpec, what’s the difference between before(:suite) and before(:all)?
- seed_fu使ってシードデータを作ったのにrspecのテストを回すとシードデータが消えている
今回はRSpecでテストを実行する際、seed_fuで作成したテストデータが削除されてしまう場合の対処方法についてまとめました。自身が地味にはまった部分なので、同じ現象で詰まっている方の参考になればと思います。