【RSpec】モデル単体テスト実行時の「MissingAttributeError」を解決する


はじめに

RSpecを用いたテスト時のエラーでつまずいたので、備忘録としてまとめます。

環境

Ruby 2.6.5
Rails 6.0.3.6

状況

Twitterのような投稿アプリを作成中です。FactoryBotを用いて、投稿に関するPostモデルの単体テストを実行したところ、「MissingAttributeError」が出ました。以下に詳細を記します。

FactoryBot

posts.rb
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カラムがなかったため、紐付かせることができず、エラーが出てしましました。

最後に

初めての投稿で分かりづらい部分が多々あるかと思いますが、どなたかの参考になれば幸いです。