2016-04-24 6 views
1

@product.industry_products.buildと残りの部分が私のアクションで定義されているかどうかはどのようにしてテストできますか?rspec matcher for new action

products_controller

def new 
    @product = Product.new 
    authorize @product 
    @product.industry_products.build 
    @product.product_features.build 
    @product.product_usecases.build 
    @product.product_competitions.build 
end  

products_controller_spec.rb

context "GET new" do 
    let!(:profile) { create(:profile, user: @user) } 
    before(:each) do 
    get :new 
    end 

    it "assigns product" do 
    expect(assigns(:product)).to be_a_new(Product) 
    end 

    it { is_expected.to respond_with 200 } 
    it { is_expected.to render_template :new } 
end 

答えて

1

あなたは、特定の方法は、あなたのコード内で呼ばれているかどうかを確認するためにモックを使用することができます。

expect_any_instance_of(Product).to receive_message_chain(:industry_products, :build).and_call_original 
expect_any_instance_of(Product).to receive_message_chain(:product_features, :build).and_call_original 

これらは前に宣言する必要がありますnewアクションが呼び出されます。

しかし、私の意見では、特定のメソッドが呼び出されているかどうかをテストすることは、コントローラのアクションに条件付きロジックがないので、この例では役に立ちません。製品上の関連付けの存在を確認することは、より信頼性の高いテストになる可能性があります。

+0

Anthony、私はモデル仕様でこれらのテストを行っています。その場合、インスタンス変数がコントローラに設定されているかどうかをテストする必要はないと思いますか? –

+0

この場合、はい。テストする場合は、 'expect(assigns(:project).industry_products.size).to eq(1)'を使用するだけです。あるいは、より良いことに、 'industry_products'フィールドがあなたのフォームに現実に現れるようにしてください。 –

関連する問題