【Ruby on Rails】単体テストでField ‘user_id’ doesn’t have a default valueが出た

Ruby on Rails

はじめに

Ruby on Railsで単体テストを行っていたところ、数日前まではエラーが出なかったテストで以下のエラーが出るようになりました。

ActiveRecord::NotNullViolation: Mysql2::Error: Field 'user_id' doesn't have a default value
このエラーは、NOT NULL制約をかけているのに値が入っていないというエラーです。
私の場合はuser_idでこのエラーが発生しましたが、このフィールドがNULLになることは通常ありません。

fixturesにはusersに使用するユーザーを設定しており、単体テストに使用するfixturesにもuser:○○を設定しています。

試したこと

rails db:test:prepare
→問題なし
rails db:reset RAILS_ENV=test
→問題なし
rails db:migrate RAILS_ENV=test
→問題なし
rails db:migrate:status RAILS_ENV=test(Statusすべてup)
→問題なし
rails console --environment test
→該当ユーザー登録なし
rails db:fixtures:load RAILS_ENV=test
→Mysql2::Error: Field 'user_id' doesn't have a default valueで実行できず

結論

新規作成したモデルにbelongs_to :userがありませんでした。

モデルにbelongs_to :userを追加したらテストが通るようになりました。

今までの状態であれば、テスト対象のモデルにはもちろん追加していますし、他のモデルにも追加していました。

ですが今回は、仕様変更のためいくつかテーブルを追加していて、それらのモデルにはbelongs_to :userを追加していませんでした。

作成した新しいモデルがテストに紐づいていたようです。

エラー対象のテーブルだけでなく、他のテーブルの設定も見直す必要がありました。

さいごに

テストや開発環境にはまだ実装していないからと新規作成したテーブルにはコードを追加していなかったのですが、裏では紐づいていたようです。このような認識の甘さがエラーを引き起こしてしまいました。
今回の経験はとても勉強になりました。

タイトルとURLをコピーしました