ウェブサービスを作っています。

実際の DB データをテストで使用する

Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。

そのような場合、seed_dumpactiverecord-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 を使うとインポート速度が上がり、テストが速くなるので便利です。