LoginSignup
3
2

More than 3 years have passed since last update.

RSpecのテストでActiveRecord::RecordInvalid:Validation failed: Email has already been taken エラー

Posted at

RSpecですべてのテストが成功して一安心!とおもってpushしてCircleCIのテスト結果を見てみたら、、

ぎゃーーー!!大量のテストに失敗している!!

エラー文の一部がこちら

Error!

ActiveRecord::RecordInvalid:Validation failed: Email has already been taken

これは最初のテストの実行が終了した際、テストデータが削除(ロールバック)されずに残ってしまっていたため、2回目のCircleCIのテストでバリデーションに失敗してエラーが発生したと考えられます。
つまり、メールアドレスはすでに登録されていたため、2回目のテストを実行したときにテストデータが生成できず失敗してしまったのです。

フィーチャースペックであればdatabase_cleanerというgemを入れるとこれを解決できます。
このgemを入れるとテスト終了時にDBをロールバックしてくれます。

しかし、私が行ったテストはシステムスペックです。システムスペックはRSpec3.7から導入されたもので、テストデータのDBをデフォルトでロールバックしてくれます。database_cleanerは不要です。

それなのに、なぜロールバックされていないんだ、、途方にくれました、、

解決策

これは一瞬で終わりました。

rails_helper.rb
 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

これをしたらテストに無事パスするようになりました。

最後まで読んでいただきありがとうございます!

日々の学習をアウトプットしています!!少しでもお役に立てれば幸いです!また、ご指摘や感想などあればコメントいただけると嬉しいです!

3
2
2

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
3
2