スクールの課題でメルカリのようなフリマアプリを作成しております。
現在単体テストを作成中です。
商品テーブルのモデルテストはrspecとfactorybotを使用して以下のように作成しました。
↓商品テーブルのitemテーブルのfactory
FactoryBot.define do factory :item do item_images {[build(:item_image)]} user_id {"1"} name {"柑橘"} explanation {"酸っぱい"} category_id {"365"} brand {"あきひめ"} condition_id {"1"} delivery_charge_id {"1"} shipping_origin_id {"24"} sending_days_id {"2"} price {"3000"} end end
商品テーブルのitem_iamges(商品の画像)のfactory
FactoryBot.define do factory :item_image do image { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/factories/test.jpg')) } end end
この状態で以下のモデルテストのコードを組んだところ、テストは成功しました。
require 'rails_helper' describe Item do describe '#create' do let(:image_path) { File.join(Rails.root, 'spec/factories/test.jpg') } let(:image) { Rack::Test::UploadedFile.new(image_path) } it "商品出品のバリデーションが機能しているか?" do item = build(:item) expect(item).to be_valid end end end
次にコントローラのコードです。
require 'rails_helper' describe ItemsController, type: :controller do describe 'GET #new' do #ログインしている状態にする let(:user) { create(:user) } before do login user end it "1.new.html.hamlに遷移する" do get :new expect(response).to render_template :new end end describe 'POST #create' do subject { post :create, params } let(:user) { create(:user) } let(:params) do (build(:item)) end context 'ログインしている場合' do before do login user end context '保存に成功した場合' do it '2.itemを保存すること' do item = build(:item) expect{post :create, params: params}.to change(Item, :count).by(1) end it '3.入力が不適切の場合、:newに飛ぶ' do expect(post :create).to redirect_to(new_item_path) end end end end #ログインしていない時の処理 it "4.ログインしていないとnew_user_session_pathに遷移する" do get :new expect(response).to redirect_to(new_user_session_path) end end
こちらでテストをすると2と3が失敗します。
3は2が失敗している時点で失敗なのはわかるのですが2が失敗に終わる理由がわかりません。
エラーメッセージを見ると
undefined method `symbolize_keys' for #Item:0x00007fdc19916c50
と表示されていました。
長くなってしまいましたが、質問としては
①`symbolize_keys'とはどの部分で出てきたものなのでしょうか?
②外部キーが原因という理解でよろしいのでしょうか?
③外部キーとなると怪しいのはuserがitem_imagesかと思い、binding.pryをおいてparamsを調べてみたところ、
paramsの中にitem-imagesがありませんでした。
id: nil, name: "柑橘", likes: 0, category_id: 365, user_id: 1, price: 3000, explanation: "酸っぱい", brand: "あきひめ", created_at: nil, updated_at: nil, transaction_status: 1, sending_days_id: 2, shipping_origin_id: 24, delivery_charge_id: 1, condition_id: 1>
モデルのときは入れれていたのにコントローラでは認識されていないということなのでしょうか?
よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/30 14:04
2020/04/30 22:20