seed.rbの内容をテストで使う

2011-03-18
2013-11-12
かなり古い記事です。現在も有効な内容であるかどうか分かりませんのでご注意ください。

テスト用DBを構築してスキーマも整えた上で以下のコマンドを打つ。

$ rake db:seed RAILS_ENV=test

簡単な話だ。
そしてautotestで回しているうちはこれで問題なかった。

が、rakeやrake specでテストを実行するとテストDBのデータがクリアされてしまい、seed.rbで入れたデータも消え去ってしまうという問題に遭遇。
どうしたものかとRakeタスクの内容を追いかけてみたが、テスト関連のタスクから完全にスルーされているのでseed.rbをテストに使うのはいかんのかとか、seed.rbって実はそんなに使われてないのかななどと言う考えが頭をよぎる。

とはいえseed.rbの内容(マスタ類)をやっぱり使いたいので、結局はspec_helper.rbに以下の行を追加することで対応した。

system("rake db:seed")

もっと賢いやり方があれば教えてください。

RailsのRakeタスク

行われている処理を追いかけるために探し回ったのでタスクのある場所をメモっておく。

  • ~/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.5/lib/rails/tasks
  • ~/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.5/lib/active_record/railties/database.rake

追っかけた内容もちょっと記しておくとrakeやrake specと打った時にdb:test:prepareが走る。
そこからdb:test:clone_structureが呼び出され、db:test:purgeも依存タスクとして実行されていた。

2013/11/12追記

現時点ではspec_helper.rbにこんなかんじで書く。

RSpec.configure do |config|
  config.before(:suite) do
    require Rails.root.join("db", "seeds")
  end

  ...

end

seed-fuというものもあるようだけど、ファイルが分かれるのがちょっと気にくわなかった。

ググってみるとFactoryGirlでSeedデータを作るみたいなやり方をしている人もいるみたいで、db/seeds.rbをイマイチと感じている人の多さを感じる。

Profile

フルスタック気味のフリーランスプログラマー。

どちらかと言うと得意はインフラ構築とサーバーサイドプログラミングですが、フロントエンドもぼちぼちやっています。

最近の興味範囲はWordPress、AWS、サーバーレス、UIデザイン。

愛車はセロー。カメラはペンタックス。旅好きです。横浜在住。