2017-10-23 7 views
0

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のを実行すると、エラーがスロービューでそれ自体最初方法の問題ではなく、補間ルビーであることを示しているようです。これにより問題が一般化され、うまくいけば解決しやすくなります。

+1

あなたの注文はタイプ整数ですので、あなたの工場に何か問題があると思います。あなたは 'base_item'ファクトリを含んでいませんでした。 'order = create(:base_item)'を実行するときは、 'base_item'を定義するファクトリを持っていなければなりません。 –

+0

上記の関連するファクトリファイルを追加しました。 – 223seneca

+0

'orderConfirmationMail'と' order_confirm_email'はどちらですか? –

答えて

2

that is not an issue, as earlier in the spec I include this line that I know is working correctly because I use the same format in another test successfully

let(:orderConfirmationMail) { UserMailer.order_confirm_email(1,2,3,4,nil) }

コンソールにデバッグおよびテストすることによって、これを理解することができます。最初からこの行を含めた場合、あなたの質問は2秒後に返答されていました。

orderが3に設定されているのはなぜだと思いますorder_confirm_email

def order_confirm_email(id, items, order, address, coupon) 

の署名を考えると? あなたはこれをこの方法で渡すので!

ミステリーが解決されました。

+2

@ 223senecaニース。今私もそれを手に入れます。彼はファクトリを使用せず、メソッド 'UserMailer.order_confirm_email(1,2,3,4、nil)'を呼び出してインスタンス変数@ orderを設定し、結果として '@order = 3'を設定していました。あなたはセルジオの問題を解決しました。 @ 223senecaはあなたの答えを正しい解決策として受け入れるべきだと私は信じています。 –

+0

これは実際に私がそれを述べたように質問に答えるので、私は解決策として受け入れます。私の工場が何とか働いていないので、今解決する必要があるという深刻な問題があるようです。その問題は、別の質問として投稿されます。 – 223seneca

+1

@ 223seneca:あなたの工場はうまく働いています。私は賭けたいです。あなたは、構築されたオブジェクトを使用しないでください。 –

0

申し訳ありませんが、私は分かりません。私はあなたのOrderItemモデルを見ていきます。なぜなら、それはちょうど1つのオブジェクトなので、@order.firstをやる理由がわかりません。 @orders.firstでは意味がありますが、@order.firstでは意味がありません。 railsで物事が意味を成さないときは、アプリケーションを構築するのは難しいです。またorderitemは、2つの異なるモデルである必要があり、私たちは建物のためorder_itemsを使用

注文が多く、または単に一つのアイテムを持つことができる2つの異なるモデル間の結合、あなたは関係を決めます。

rspecあなたはデバッグすることができ、rails c test環境でも工場をテストすることができます。そこには、私はそれがオブジェクトである必要があり、たぶん、あなたfactoryは、私たちが

期待するものではありません undefined method 'first' for 3:Fixnum

を言っている理由を私は理解していないと信じてcreate(:base_item)のかFactoryGirl.create(:base_item)

の結果が何であるかを確認することができます

しかし、あなたはそれがあなたの工場があり

+0

コンソールでデバッグしようとしましたが、トラブルの原因を特定できませんでした。 更新プログラム2は、さらに便利なコンテキストを提供しますか? – 223seneca

+0

@ 223seneca問題が解決しました。 Sergio Tulentsevはこの問題を解決しました。他の問題がある場合は、新しい問題を開くことができます。また、セルジオからの回答を受け入れる必要があります。私はそれを読んでいます。それはあなたの問題の解決策です。 –

+0

@FabrizioBertoglio:それはあまり「解決策」ではなく、問題の原因を指摘しています:) –

関連する問題