とーますメモ

Ruby on Rails / Goなどの学習メモ

【RSpec】テスト時に他のDBと同じデータを使いたい!

結論から書くと以下。

1)seed_dumpでDBからデータを抽出
2)db:seed用のrakeタスクを作成
3)1)で作成したファイルを指定し、データを挿入

FactoryBot(旧:FactoryGirl)では面倒くさい時、
開発用などデータが入っているDBのデータを、
そのまま利用したい時は、この方法が役立つ。

1)seed_dumpでDBからデータを抽出

インストール

gem 'seed_dump'

seed_dumpをデフォルトで使用するとdb/seeds.rbを上書きするので、
以下のように書き出し先を指定して、DBからseedファイルを作成する。
※seedsディレクトリは予め作成しておく。

$ bundle exec rake db:seed:dump FILE=db/seeds/20171212_all.rb

デフォルトだと、全テーブルを抽出するが
もちろん、抽出するモデルを指定したり、件数を指定することもできる。
詳細は以下。

github.com

2)db:seed用のrakeタスクを作成

やり方は下記のサイトさんのやり方をそのまま利用すればよい。
qiita.com

lib/tasks/seed.rakeを作成

Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')).each do |file|
  desc "Load the seed data from db/seeds/#{File.basename(file)}."
  task "db:seed:#{File.basename(file).gsub(/\..+$/, '')}" => :environment do
    load(file)
  end
end

3)1)で作成したファイルを指定し、データを挿入

後はファイルを指定して、流すだけ。(注: [.rb]は不要)

$ bundle exec rake db:seed:20171212_all RAILS_ENV=test