2017-05-30 17 views
0

特定のテストでは、私のサイトから複数の項目(package_sets)をいくつかの注文に追加したいと思います。現実の世界ではRSpecはポストリクエストの間にインスタンス変数を保持します

context "with multiple package sets from different shops" do 

    let(:package_sets) { FactoryGirl.create_list(:package_set, 3) } 

    it "adds package sets to multiple orders" do 
     package_sets.each do |package_set| 
     post :create, {'package_set_id': package_set.id} 
     expect_json(success: true) 
     end 
     expect(Order.count).to eq(3) 
    end 

    end 

、私はそれが異なるために設定されたパッケージを割り当てますpost :create呼び出すたびに従うよう

それをテストするために、私がやります。注文の合計数が、私はこの

def order 
    @order ||= cart_manager.order(shop: package_set.shop, call_api: false) 
end 

のような方法以内に注文をmemoize私のコントローラ3.

である必要があり、それは3つの異なった要求なので、私はテストがメモ化せずに、あまりにもこの方法をリロードする期待していましたただし、post要求の間には@orderがメモされているため、テストが失敗します。

どうしますか?

答えて

1

ここで起こるのは、RSpecがあなたの例内に新しいコントローラインスタンスを作成しないということです。あなたがテストにそのロジックの一部をリークすることによってこれを克服することができます:

controller.instance_variable_set(:@order, nil) 

をおそらくコードは、この特定の問題のために短縮されましたが、あなたは、単一のアクションのためのコントローラをテストしてみますか?あなたはbefore - ブロックで@order変数をリセットすることができ

package_set = FactoryGirl.create(:package_set) 
expect do 
    post :create, {'package_set_id': package_set.id } 
end.to change(Order, :count).by(1) 
+0

作業溶液、私はそれを承認するが、そこに実際にRSpecのを経由して、手動でリロードする他のソリューションではありませんよね? – Laurent

+0

@Laurentおそらくあなたの例は非常に少ないですが、なぜコントローラーを3回テストし、それが3回実行されたかどうかを確認してください。一度それをテストしてみませんか? –

+0

はい、テストセットが短縮されました。私は既に1つのリクエストでテストしています。私はこの方法でテストしています。なぜなら、すべてのものの下に大量の注文割り当てロジックがあり、アイテムを連続して追加すると正しく動作することを確認する必要があるからです。 – Laurent

0

describe Class do 
    before(:each) do 
     @order = Order.new() 
    end 

    context "with multiple package sets from different shops" do 
     #... 
    end 
end 
+1

後で問題を引き起こす可能性のあるコントローラロジックをテスト内で動かすため、理想的ではありませんが、ここにはアイデアがあります。私はそれをするのを避けたいと思っていましたが、他にはあまりできないことがあります。 – Laurent

関連する問題