images_attributesでパラメーターに渡るimageがテストで通せない。
商品売買アプリをrailsにて作成中です。fields_forを使用し子モデルであるimageモデル(親モデルはitemモデル)を登録する形を取り、データベースへの登録まではうまくできるところまではできました。
テストコードをRspecとfactoryBotを使用し書いているのですが、エラーが発生してしまいます。画像投稿にはCarrierWaveを使用しています。
以下最初に問題が出ているところをあげたいと思います。
発生している問題・エラーメッセージ
### bundle exec rspecするとターミナル内に表示されるエラー分
1) Item#create name,description,price,condition_id,delivery_fee_id,shipping_method_id,ship_from_area_id,shipping_day_id,category_id,brand_id,size_id,user_id,imagesが存在すれば登録できること Failure/Error: image = create(:image) ActiveRecord::RecordInvalid: バリデーションに失敗しました: Itemを入力してください # ./spec/models/item_spec.rb:16:in `block (3 levels) in <top (required)>'
item_spec.rb内の記述
require 'rails_helper' describe Item do describe '#create' do it 'name,description,price,condition_id,delivery_fee_id,shipping_method_id,ship_from_area_id,shipping_day_id,category_id,brand_id,size_id,user_id,imagesが存在すれば登録できること' do user = create(:user) category = create(:category) size = build(:size) ship_from_area = build(:ship_from_area) delivery_fee = build(:delivery_fee) shipping_day = build(:shipping_day) shipping_method = build(:shipping_method) condition = build(:condition) brand = build(:brand) image = create(:image) item = build(:item,condition_id: condition.id,delivery_fee_id: delivery_fee.id,shipping_day_id:shipping_day.id,shipping_method_id:shipping_method.id,user_id: user.id,ship_from_area_id: ship_from_area.id, category_id:category.id, size_id: size.id,brand_id:brand.id,images:image.images) expect(item).to be_valid end end end
FactoryBotのitem.rbの記述
FactoryBot.define do factory :item do id {'1'} name {"testitem"} description {"hello world it is test"} price {"5000"} end end
FactoryBotのimage.rbの記述
FactoryBot.define do factory :image do image {File.open("#{Rails.root}/public/images/test_image.jpg")} item_id {'1'} end end
itemモデルでのエラー発生箇所のバリデーション記述
itemテーブルへ登録時にimageテーブルへimageも通すためvalidates_associatedを使用すると調べたら出てきたのでこのように記述しました。(submitを押すとimageがない場合は通らなかったのでバリデーションは間違っていないはず)
validates_associated :images validates :images, presence: true
色々とcarrierwaveを使用した画像投稿のRspecテストの記事を参考にさせていただき、factoryBotでのimageカラムへのイメージの呼び出し方が違うのかと思い書き方を参考にさせてもらいましたがそれもうまくいきませんでした。(下もその一つ。)
image { [ Rack::Test::UploadedFile.new(Rails.root.join( 'public/images/test_image')
fields_forを使用し、image_attributesという形でパラメーターが送られる形のためテスト内にもアソシエーションを組む必要があるのかな?と思いながらも書き方もわからずに止まってしまっています。
まだまだ初心者で現在の問題に対して、どのように向かい合えばいいかがわからない状況です。
どうかアドバイスをよろしくお願いします。
あなたの回答
tips
プレビュー