悩ましいseed用データ作り
db/seeds.rb
で利用するデータは大別すると以下の2つに分かれるかと思います。
- マスタデータ(例:国名、首都、都道府県、市区町村など)
- 環境別の初期データ(例:開発環境の登録済みユーザアカウントなど)
これらのうち、マスタデータについてはそれほど問題はないのですが、登録済みのユーザアカウントとなるとユーザーテーブルと関連するテーブルが増えるほど作成が面倒になってきます。これを解決するためにdevelopment環境でもFactoryGirlを使ってテスト用のデータを読み込むという手を使うこともできるのですが、FactoryGirlをdevelopmentで使うのを避けたいという人はいるでしょう。
seed_dumpを使ってデータベースの中身をダンプする
そこで活躍するのがseed_dumpです。このgemはデータベースにあるデータをdb/seeds.rb
でそのまま使えるコードとしてdumpしてくれます。db:seed:dump
というrake taskを呼ぶことでデータをダンプしてくれるのですが、デフォルトだとその時点でデータベースに入っているデータでdb/seeds.rb
を上書きするというワイルドな動作をするので環境変数でオプション指定するほうがいいでしょう。書き出し先ファイルはFILE
で指定できます。
rake db:seed:dump FILE=tmp/users.rb
他にもMODELS
,LIMIT
などのオプションがあるので、READMEを参照してください。
開発環境用の初期ユーザデータをテストデータベースから取り出す
アプリケーションの開発が進んでくると、往々にしてseeds.rbのデータが古くなってきます。新たなメンバーがプロジェクトに入ったり、なんらかの理由でデータベースをリセットしない限りこの問題は気づかれないことが多いです。seeds.rbのデータのうち、特に登録済みユーザのデータが正しく登録できないと開発環境で操作することができないということになります。
このような場合、他の開発者が持っている開発用データベースから必要なテーブルだけdumpしてseeds.rbを更新するという手もありますが、テストが書かれていればテスト用データベースからデータをダンプするという手があります。この方法であれば、(作業をした時点では)実質的にFactoryGirlをseeds.rbに入れるのと同じことになります。
やり方は簡単で、
- seed_dumpをテストでも使えるようにしておく(Gemfileでgroup :development, :testに入れておく)
- ユーザ登録用のエンド・ツー・エンドテストでユーザ登録が完了したタイミングで
pry
などを用いてテストの実行を止める。 -
RAILS_ENV=test rake db:seed:dump FILE=tmp/test_data.rb
のようにしてテストデータをダンプする。
のようにして行えます。この方法はシードデータを作るときだけでなく、テストの任意の時点で「どういうデータ構成になっているんだ??」というときにも便利かもしれません。SQLをダンプするよりはRubyで表現されているほうがわかりやすいでしょう。