seed.rbの内容をテストで使う
テスト用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をイマイチと感じている人の多さを感じる。
“seed.rbの内容をテストで使う” に対して2件のコメントがあります。
コメントは受け付けていません。
require Rails.root.join(‘db’,’seeds’)
で、いいそうです。
参考: https://groups.google.com/forum/#!topic/boston-rubygroup/fZxpVHZkFvA
# dbをクリアするコードを seeds.rb に含んでおかないとどんどん増えそうですが。
ありがとうございます。
requireするだけでいいんですね。言われてみれば確かに。