factory_botを使用してインスタンスを作成するRSpecテストがあります。テストでは、の最初のメソッドがビュー内で使用されている場合を除いてテストに合格します。RSpecでfactory_bot(以前のfactory_girl)を使用してRailsでテストする場合、未定義のメソッドfirstから
これはテストされているコードです:
def order_confirm_email(id, items, order, address, coupon)
@user = User.find(id)
@items = items
@order = order
@address = address
if coupon == nil
@coupon = ''
else
@coupon = coupon.discount
end
mail(to: @user.email, subject: 'Order completed')
end
これはテストです:
it 'sends an email upon checkout process completion' do
user = create(:user)
items = create(:base_item)
order = create(:base_item)
address = create(:address)
coupon = create(:coupon)
expect(orderConfirmationMail.subject).to eq('Order completed')
end
これまでのところは良いです。それから私は、次のエラーが表示さ
<h1>Order id - <%= @order.first.id %></h1>
:次の場合のいずれかのビューは以下のように、最初のインスタンスにアクセスしようとした。しかし私の理解によると
Failures:
1) UserMailer user_emails sends an email upon checkout process completion
Failure/Error: <!-- <h1>Order id - <%= @order.first.id %></h1> -->
ActionView::Template::Error:
undefined method `first' for 3:Fixnum
を私が使用しているため、インスタンスは永続化されなければなりませんの代わりにを作成してください。しかし、明らかにそれは起こっていない。ビューを変更することは、最後の手段以外の選択肢ではありません。これをどうやって解決するのですか?
UPDATE 1:
FactoryBot.define do
factory :base_item, class: OrderItem do
item_name_en "Sample Item"
item_link "http://www.foo.com"
qty 5
available_qty 100
item_price 10
seller_name "foo"
status "foo"
foo_item_id "123456"
foo_id "654321"
end
factory :order_item1, parent: :base_item do
foo_item_id "123456"
foo_seller_id "654321"
association :order
end
factory :order_item2, parent: :base_item do
foo_item_id "123457"
foo_seller_id "654321"
end
factory :order_item3, parent: :base_item do
foo_item_id "123458"
foo_seller_id "654322"
end
end
UPDATE 2:
別のテストを書くとき、私は同様の問題に遭遇していますこれは、order_items.rb工場ファイルです
。私は、次のエラーが表示されます
Failures:
1) UserMailer user_emails sends an email upon abandoned cart
Failure/Error: <% @items.each do |item| %>
ActionView::Template::Error:
undefined method `each' for 1:Fixnum
これは、私はRSpecのを実行すると、エラーがスロービューでそれ自体最初方法の問題ではなく、補間ルビーであることを示しているようです。これにより問題が一般化され、うまくいけば解決しやすくなります。
あなたの注文はタイプ整数ですので、あなたの工場に何か問題があると思います。あなたは 'base_item'ファクトリを含んでいませんでした。 'order = create(:base_item)'を実行するときは、 'base_item'を定義するファクトリを持っていなければなりません。 –
上記の関連するファクトリファイルを追加しました。 – 223seneca
'orderConfirmationMail'と' order_confirm_email'はどちらですか? –