はじめに
RSpecを用いたテスト時のエラーでつまずいたので、備忘録としてまとめます。
環境
Ruby 2.6.5
Rails 6.0.3.6
状況
Twitterのような投稿アプリを作成中です。FactoryBotを用いて、投稿に関するPostモデルの単体テストを実行したところ、「MissingAttributeError」が出ました。以下に詳細を記します。
FactoryBot
FactoryBot.define do
factory :post do
# 省略
association :user
# 省略
end
end
association :userは、users.rbのFactoryBotとアソシエーションがあることを意味しています。つまり、Postのインスタンスが生成したと同時に、関連するUserのインスタンスも生成されます。
exampleを書き出し、試しにテストを実行するとエラー発生
ActiveModel::MissingAttributeError:
can't write unknown attribute `user_id`
「user_idという属性は知らないよ」という内容です。
postsテーブルを確認
テーブルのカラムを確認していくと、user_idカラムがありませんでした。
マイグレーションファイルを確認
t.references :user の記述を忘れており、テーブル作成時にuser_idカラムが作られなかったことがわかりました。
user_idカラムを追加し、エラー解決
カラムの追加方法は、他の方の分かりやすい記事がありますので、ご参考ください。
私はこちらを参考にさせていただきました。
https://qiita.com/kurawo___D/items/e3694f7a870a1cc4738e
まとめ
postはuserに紐付いているため、FactoryBotでassociation :userと記述し、紐付くuserデータを同時生成しようとしました。
しかし、postテーブルにuser_idカラムがなかったため、紐付かせることができず、エラーが出てしましました。
最後に
初めての投稿で分かりづらい部分が多々あるかと思いますが、どなたかの参考になれば幸いです。