2016-04-24 4 views
1

Как и с каким совпадением я могу проверить, если @product.industry_products.build, а остальные определены в моем действии?rspec matcher для сборки в новом действии

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

Энтони, у меня есть те тесты в спецификации модели. Итак, вы думаете, что в этом случае нет необходимости проверять, установлены ли переменные экземпляра в контроллере? –

+0

В этом случае да. Если вы хотите проверить, что они вызваны, просто используйте 'expect (присваивает (: project) .industry_products.size) .to eq (1)'. Или, еще лучше, убедитесь, что поля 'industry_products' действительно отображаются в вашей форме. –