2012-06-18 39 views
1

我有一个订单模型,其中has_many付款和结帐控制器。如果没有付款,控制器应该创建新的付款。扼杀或嘲弄Foo.has_many酒吧并预先填充酒吧

private 
# Helper method allows calling from several controller-callbacks. 
def add_payment_if_not_exists 
    if @order.payments.empty? 
    Payment.create(...) 
    end 
end 

,现在我想在CheckoutControllerSpec

it 'should not add a payment when already added' do 
    @order = mock_model(Order) 
    @order.payments << mock_model(Payment).as_null_object 

    Payment.should_not_receive(:new) 
    post :homecoming, @params 
end 

符合规范这种行为不过,这将引发

Failure/Error: @order.payments << mock_model(Payment).as_null_object 
    Mock "Order_1003" received unexpected message :payments with (no args) 

不知怎的,我还是不神交rspecs磕碰和完全嘲讽的概念。我错在哪里?

回答

1
@order = mock_model(Order) 

在这里你创建一个模拟对象,只是一个空白的画布。如果你想设置的东西,你应该告诉它回应:付款与某事。在这种情况下,具有1个条目的数组(模拟支付对象)

@order.stub(:payments) { [mock_model(Payment).as_null_object]} 

这会让您走得更远。其他说明:

  • 我不确定这个期望Payment.should_not_receive(:new)测试你的行为。您实际上拨打Payment.create,而不是Payment.new
  • 我希望您将Order.find留在某处以返回@order,但这里没有显示,对吧?
  • 我通常会简化@order以下几点:

这里我们说#payments返回一个非空数组,我们不关心的内容。

@order = mock_model(Order) 
@order.stub(:payments) { [stub] } 
+0

谢谢。残根是我忘记的东西。我简化了代码。现在我实际上在块之前将大部分数据存储在数据库中,因为我正在Spree中进行测试,Spree是紧耦合模型的spagetti-monster。但我正在重构我的测试以更频繁地使用存根和嘲讽。 – berkes