実際の DB データをテストで使用する
Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。
そのような場合、seed_dump と activerecord-import を使ってうまく実現することができました。
Gemfile
group :development do gem 'seed_dump' end group :test do gem 'activerecord-import' end
使わない環境では、gem を読み込まないようにします。
script/dump_models.rb
DUMPED_MODELS = [Site, Category, SubCategory] OUTPUT_FILE = 'spec/fixtures/seed.rb' DUMPED_MODELS.each_with_index do |model, i| options = { append: (i > 0), file: OUTPUT_FILE, exclude: [:created_at, :updated_at], import: true, } SeedDump.dump model, options end
ダンプ用のスクリプトです。
モデルの関連を考慮して、DUMPED_MODELS
の順番を決めます。
seed_dump のデフォルトでは id カラムが出力されませんが、モデルの関連があるので、id が出力されるように exclude
オプションを調整します。
また activerecord-import を使うので、import
オプションを true にします。
開発環境などでスクリプトを実行し、データをダンプします。
rails runner script/dump_models.rb
spec/fixtures/seed.rb にインポート用のファイルが出力されます。
最後に、RSpec で seed タグが設定されている example に対し、データがロードされるようにします。
spec/support/shared_context/seed.rb
RSpec.shared_context 'Importing seed' do before { load Rails.root.join('spec/fixtures/seed.rb') } end RSpec.configure do |config| config.include_context 'Importing seed', :seed end
テストの例です。
describe FooJob, '#perform', :seed do it 'seed が設定されている' do expect(Site.count).not_to eq 0 end end
activerecord-import を使うとインポート速度が上がり、テストが速くなるので便利です。