RSpecでテストデータベースを準備
rake db:test:prepare
rakeタスク
$ ./bin/rake db:test:prepare
起きること
テスト用schemaを読み込んでmigrationにpendingがないかチェック
通常、テスト実行前にDBを用意する時はこれを使う!
開発用にDBをリセット
rake db:reset
rakeタスク
$ ./bin/rake db:reset
起きること
- 対象のデータベースをドロップ
- 現在の schema をロードして DB を作り直す
- シードデータを投入
参考:第5回: データベーステーブルとモデル - Ruby on Rails 3.0 日記 - Ruby on Rails with OIAX
Rake タスク db:reset は、データベースを drop して全テーブルを作り直してからシードデータを投入しますので、ご注意ください。
使うシチュエーション
-
db/seeds.rb
に開発用データがある - 開発中なので時々DBをリセットしたい
勘違いしてたこと・・
DBリセット、なので ./bin/rake db:reset RAILS_ENV=test
(RAILS_ENV=xxx
を指定すると、どの環境でタスクを実行するか指定可)としてた。
これだと、テスト実行前に seed.rb
で指定するデータが投入された状態でテストが実行される。
テスト前に入れられているため、各 it 毎にロールバックもされないので、テスト実行に必要なマスタデータ投入などの目的があればOK.
自分の場合は特にマスタデータとかではなかったので、seed邪魔くさいな〜とか思いながら、it 実行前にテストデータをクリアするために、わざわざ DatabaseRewinder
を入れてた。。
DatabaseRewinder 使用時の注意
普通に初心者がキレイにテストデータをspecごとに書いてる場合、DatabaseRewinderなどで強制的にテストデータをクリアしなくて大丈夫のはず。
理由は:
- 各スペックごとに投入してるテストデータは、スペック終了後に自動でクリアされる
- 影響範囲をチェックしながら必要なスコープのみにデータが適用されるテストを書くほうが良い
- テスト終了前後にデータがクリアでない状態でテストを書くと、再現性がないテストになるので良くない
参考記事:
おまけ
rake db:migrate:reset
というものがあることをついでに知った。
rake db:reset と rake db:migrate:reset の違い | EasyRamble
rake db:reset は db/schema.rb からDB作成
rake db:migrate:reset は db/migrate/**.rb からマイグレーション新しくマイグレートファイルを作成してマイグレートを実行した後、カラムのデータ型やオプション指定を修正したくなって、その作成したばかりのマイグレートファイル自体を修正してマイグレーションを新たに適用したい場合。
ああ!コレある!!!
良いものを知った♪