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をイマイチと感じている人の多さを感じる。

この投稿へのコメント

  1. kuboon said on 2012年1月17日 at 12:14 AM

    require Rails.root.join(‘db’,’seeds’)
    で、いいそうです。

    参考: https://groups.google.com/forum/#!topic/boston-rubygroup/fZxpVHZkFvA

    # dbをクリアするコードを seeds.rb に含んでおかないとどんどん増えそうですが。

  2. akahige said on 2012年1月17日 at 12:46 PM

    ありがとうございます。
    requireするだけでいいんですね。言われてみれば確かに。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL