LoginSignup
15
9

More than 5 years have passed since last update.

初心者のためのRSpec テストデータベースの準備 (seedがある時の注意点)

Posted at

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=testRAILS_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 からマイグレーション

新しくマイグレートファイルを作成してマイグレートを実行した後、カラムのデータ型やオプション指定を修正したくなって、その作成したばかりのマイグレートファイル自体を修正してマイグレーションを新たに適用したい場合。

ああ!コレある!!!
良いものを知った♪

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9