環境
Ruby 2.6.5 / Ruby on Rails 6.0.5
Rspec-rails 5.1.2
実現したいこと
単体テストを実施するにあたり、FactoryBotにおいて、画像を紐付けた親インスタンス(Userインスタンス)を子インスタンス(Categoryインスタンス)の生成でアソシエーションしたい。
前提
親モデル
ruby:user.rb
1class User < ApplicationRecord 2 devise :database_authenticatable, :registerable, 3 :recoverable, :rememberable, :validatable 4 5 has_one_attached :image 6 has_many :categories, dependent: :destroy 7end
子モデル
ruby:category.rb
1class Category < ApplicationRecord 2 belongs_to :user 3end
該当のソースコード
まずUserモデルのFactoryBotで画像を紐付け。
ruby:factories/users.rb
1FactoryBot.define do 2 factory :user do 3 name { Faker::Name.last_name } 4 email { Faker::Internet.free_email } 5 password { Faker::Internet.password(min_length: 6) } 6 password_confirmation { password } 7 end 8 9 after(:build) do |user| 10 user.image.attach(io:File.open('app/assets/images/guest_image.jpg'), filename: 'guest_image.jpg') 11 end 12end
CategoryモデルのFactoryBotでassociationでuserインスタンスを作成し、インスタンスを紐付け。
ruby:factories/category.rb
1FactoryBot.define do 2 factory :category do 3 name { Faker::Name.last_name } 4 describe { Faker::Lorem.sentence } 5 association :user 6 end 7end
CategoryモデルのSpecファイルにてcategoryインスタンスをbuildで生成。
ruby:category_spec.rb
1require 'rails_helper' 2 3RSpec.describe Category, type: :model do 4 before do 5 @category = FactoryBot.build(:category) 6 end 7 8 describe 'カテゴリ新規登録' do 9 ・・・
発生している問題・エラーメッセージ
Failure/Error: user.image.attach(io:File.open('app/assets/images/guest_image.jpg'), filename: 'guest_image.jpg') NoMethodError: undefined method `image' for #<Category:0x00007fde66b45d10> # ./spec/factories/users.rb:12:in `block (2 levels) in <main>' # ./spec/models/category_spec.rb:5:in `block (2 levels) in <top (required)>'
考察・試したこと
CategoryモデルのFactoryBotにおいて、association :userではcreateでインスタンス生成が呼び出されているためimageが紐付いていないと理解しているのですが、エラー文においては、UserモデルのFactoryBotで設定したafter(:build) do のブロック変数にcategoryインスタンスが入り、それに対してimageを呼び出してエラーになっているようで、その理由がわかりません。
また、associationでインスタンスを生成せず、specファイルの方で先にuserインスタンスをbuildし、saveメソッドでインスタンスを保存してからcateogryインスタンスをbuild(associationではなくuser_id: @user.id)しても
同様のエラーが出てしまいます。
そもそもどの様な方法でアソシエーションをすれば、画像の紐付けもできるのかがわかりません。
どなたかご教示頂けますでしょうか?

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/13 13:53