質問: Railsのモデルテストについてですが、 重複をはじくバリデーションのテスト実装時に疑問が生まれました。 テスト実行中に、modelのcreateメソッド等で レコードを作成してもテストが終わると、全部消えているようです。 テスト用のデータベースには、 テスト完了後にまとめて自動削除する仕様でしょうか? それとも、it do ~ end ごとに、 毎回データベースを削除し、次のテスト項目では引継げない仕様でしょうか? ご存知の方、教えていただけますと幸いです。 よろしくお願い申し上げます。
回答: 環境や設定にもよりますがデフォルトでは `it do ~ end` ごとにデータをクリアしています。 `spec/rails_helper.rb` を見ると、以下のような設定があると思います。 ``` config.use_transactional_fixtures = true ``` `use_transactional_fixtures` が有効になっていると、example(つまり `it do ~ end` で囲まれた部分)がデータベースのトランザクションの中で実行され、最後にロールバックされてデータが消えます。 ``` # 最初のexample Transaction開始 ↓ テストが実行される ↓ Rollback(データがすべて消える) # 次のexample Transaction開始 ↓ テストが実行される ↓ Rollback(データがすべて消える) . . . ``` `database_cleaner`などのGemを使っているケースではこのあたりの挙動が変わるのでご参考までに。 ※ 参考リンク * https://relishapp.com/rspec/rspec-rails/docs/transactions * https://github.com/DatabaseCleaner/database_cleaner