RSpecですべてのテストが成功して一安心!とおもってpushしてCircleCIのテスト結果を見てみたら、、
ぎゃーーー!!大量のテストに失敗している!!
エラー文の一部がこちら
ActiveRecord::RecordInvalid:Validation failed: Email has already been taken
これは最初のテストの実行が終了した際、テストデータが削除(ロールバック)されずに残ってしまっていたため、2回目のCircleCIのテストでバリデーションに失敗してエラーが発生したと考えられます。
つまり、メールアドレスはすでに登録されていたため、2回目のテストを実行したときにテストデータが生成できず失敗してしまったのです。
フィーチャースペックであればdatabase_cleanerというgemを入れるとこれを解決できます。
このgemを入れるとテスト終了時にDBをロールバックしてくれます。
しかし、私が行ったテストはシステムスペックです。システムスペックはRSpec3.7から導入されたもので、テストデータのDBをデフォルトでロールバックしてくれます。database_cleanerは不要です。
それなのに、なぜロールバックされていないんだ、、途方にくれました、、
解決策
これは一瞬で終わりました。
RSpec.configure do |config|
config.use_transactional_fixtures = true
# ↑この一文がfalseになっていた
〜 (省略) 〜
end
トランザクションのロールバック設定がfalseになっていました。
フィーチャースペックを使っていた時、database_cleanerのgemを導入する際にここをfalseにしたのでその設定のままシステムスペックを実行してしまってました。
この変更をtrueにしただけではdbのロールバックがされるようになっただけで、現状テストデータはまだ残ったままなのでテストは同じように失敗してしまいます。
この後、テスト環境におけるDBデータをリセットする必要があります。。
docker-compose run app rails db:migrate:reset RAILS_ENV=test
これをしたらテストに無事パスするようになりました。
最後まで読んでいただきありがとうございます!
日々の学習をアウトプットしています!!少しでもお役に立てれば幸いです!また、ご指摘や感想などあればコメントいただけると嬉しいです!