2016-04-24 12 views
1

Wie/mit dem Matcher kann ich testen, ob @product.industry_products.build und der Rest in meiner Aktion definiert werden?rspec Matcher für Build in neuer Aktion

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 

Antwort

1

Sie Mocks verwenden können, um zu überprüfen, ob bestimmte Methoden in Ihrem Code aufgerufen werden:

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 

Diese sollten vor dem deklariert werden new Aktion wird aufgerufen.

jedoch meiner Meinung nach, zu testen, ob bestimmten Methoden aufgerufen werden, ist gar nicht so nützlich, in diesem Beispiel, da es in Ihrer Controller-Aktion keine bedingte Logik ist. Die Überprüfung der Existenz von Assoziationen auf Produkten könnte ein zuverlässigerer Test sein.

+0

Anthony, ich habe diese Tests in Modell spec. Sie denken also, dass in diesem Fall nicht getestet werden muss, ob Instanzvariablen im Controller gesetzt sind? –

+0

In diesem Fall ja. Wenn Sie testen möchten, dass sie aufgerufen werden, verwenden Sie 'expect (assigns (: project) .industry_products.size) .to eq (1)'. Oder, noch besser, stellen Sie sicher, dass die 'industry_products' Felder tatsächlich in Ihrer Form angezeigt werden. –

Verwandte Themen