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