用于构建新动作的rspec匹配器

时间:2016-04-24 11:01:03

标签: ruby-on-rails testing rspec controller

我可以如何/在哪个匹配器中测试@product.industry_products.build,其余是在我的行动中定义的?

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 个答案:

答案 0 :(得分: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动作之前声明。

但是,在我看来,测试某些方法是否被调用在这个例子中并不是那么有用,因为你的控制器动作中没有条件逻辑。检查产品关联是否存在可能是一种更可靠的测试。