LoginSignup
28
25

More than 5 years have passed since last update.

DatabaseRewinderでseedなど消さないで欲しいデータがいる場合の対処方法

Last updated at Posted at 2015-03-27
  • seedで入れたデータがtest DBのテーブルに入っている
  • どういうわけか、ユーザーがそのテーブルに追加する箇所があり、そのテストを書きたい

DatabaseRewinderの動きをおさらい

DatabaseRewinderは、そのテストが走っている時に実行された 1. INSERT文を監視して対象テーブルを記憶 して、 2. DatabaseRewinder.clearしたときにその対象テーブルに対してDELETE文を発行する

問題が起きるシーン

テストの中で、seedで入れたデータが存在するテーブルにデータを追加する場合、 INSERT文が発行される ので、DatabaseRewinderの削除対象となってしまい、seedで入れたデータが失われる。

解決方法

DatabaseRewinderが以下のように設定されているという前提

spec/rails_helper.rb
RSpec.configure do |config|
  config.before(:all) do
    DatabaseRewinder.clean_all
  end

  config.before(:each) do
    DatabaseRewinder.clean
  end
end

テストの中で、以下の様な after 処理を用意しておく。

hogehoge_spec.rb
  after :each do
    # このtest内でpiyopiyo_categoryを増やすがDatabaserewinderの対象としない
    DatabaseRewinder.cleaners.each do |cleaner|
      cleaner.inserted_tables.reject!{|table| table.match /piyopiyo_categories/}
    end
    # 増やした分 = user_id: 0以外を消す
    PiyoPiyoCategory.where.not(user_id: 0).delete_all
  end

根本解決

  • seedもfactoryですべて用意する
  • before :eachで流せるレベルのコンパクトなテスト用seedを用意する
  • 設計の段階でマスターデータの存在するテーブルとユーザーが追加しうるデータを混在させない
28
25
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
25