RSpec

【RSpec】テスト実行時にseed_fuのテストデータが削除されてしまう場合の対処法

RSpec

 

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

Rails
【Rails】初期データの追加や管理が楽にできるseed_fuの使い方についてまとめてみたseed_fuを用いた初期データの投入方法について解説しています。seed_fuを用いることで、初期データの追加や管理がかなり便利になるため、seeds.rbで初期データを管理しているアプリケーションがあれば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】before(:suite)/before(:all)/before(:each)それぞれの違いについてまとめてみたRSpecのbefore(:suite)/after(:suite)とbefore(:all)/after(:all)、before(:each)/after(:each)それぞれの違いについてまとめています。それぞれの実行タイミングが異なり、忘れがちな部分でもあるので備忘録としてまとめています。...

まとめ

  • RSpec実行時にテストデータが削除されてしまう現象は、RSpecがテスト実行前に保留中のマイグレーションをチェックすることが原因
  • spec/spec_helper.rbにbefore(:suite)before(:all)を用いてテスト前にデータを入れるようにすることで対処できる

参考

 

 

今回はRSpecでテストを実行する際、seed_fuで作成したテストデータが削除されてしまう場合の対処方法についてまとめました。自身が地味にはまった部分なので、同じ現象で詰まっている方の参考になればと思います。