はじめに
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
を追加していませんでした。
作成した新しいモデルがテストに紐づいていたようです。
エラー対象のテーブルだけでなく、他のテーブルの設定も見直す必要がありました。
さいごに
テストや開発環境にはまだ実装していないからと新規作成したテーブルにはコードを追加していなかったのですが、裏では紐づいていたようです。このような認識の甘さがエラーを引き起こしてしまいました。
今回の経験はとても勉強になりました。