はじめに
rspecにてテストを書いていた際に起こった不可解なエラーについて今回は記載します。
間違い等ございましたらご指摘いただけますと幸いです。
起きた事象
rspecにて個別ファイルでテストを実施するとエラーにならないのに、テスト全部を一気に実施するとエラーになりました。
エラーの内容は下記です。
ActiveRecord::RecordNotUnique:
Mysql2::Error: Duplicate entry '97' for key 'users.PRIMARY'
まずは開発環境
- Ruby 3.1.2
- Rails 7.0.4
- RSpec 3.12
結論
userテーブルのidが重複したことによるエラーなので
テスト環境のuserデータを全て削除すれば問題なしでした。
私の場合Dockerを使っていたので、下記で修正完了です。
// テスト環境のRails consoleを開く
docker-compose run web bundle exec rails c -e test
// consoleを開いたらuserデータを全件削除
// 一応dependent: :destroyを指定して関連付けたデータも削除
// モデル名.destroy_allでOK
User.destroy_all
上記を実行したら、97というidのuserが削除されました。
その後rspecを実行すると無事にエラーにならず処理が完了しました。
めでたしめでたし
導き出すまで
エラー文をまずはしっかり読みましょう。(自戒の念を込めて)
エラー文にはuserテーブルのid97が重複していると教えてくれています。
ただなんじゃこれは状態です。
idの97だけが存在することなんてあるのか?という気持ちが解決までの時間をさらに引き延ばします。
ただ、テスト環境にuserを作ったわけでもないですし、ましてや97だけ?そんなわけないだろって思いますよね??
でもdestory_allしたら確かにSQLが発行されていました。
本当にidが97だけ本当にできていたようです。
なぜか分かりませんが、どうやらテストの途中で保存されていたらしい
です。
rspecの処理中にbinding.pryで値を確認していた際に何かの間違いで保存されてしまったのかも?
idが1じゃなくてもレコードが存在することはありえます!!(stap細胞)
どなたかの参考になれば幸いです。