3
#controller file
def update
  @payment = Payment.find_by(reference_id: params[:reference_id])
  if @payment.update(update_params)
    @payment.do_something
  end
end

当试图指定是否调用了 do_something 方法时,通过

expect(@payment).to receive(:do_something)

它说

expected: 1 time with any arguments
received: 0 times with any arguments

do_something 在我的支付类中。它实际上被调用了,但 rspec 说没有。

有任何想法吗?提前致谢

4

2 回答 2

2

首先,您需要对控制器中的行进行存根以expect编写一些代码

before do
  allow(Payment).to receive(:find_by).and_return(payment)
  allow(payment).to receive(:update).and_return(true)
  allow(payment).to receive(:do_something)
end

此外,控制器中的实例变量将无法在 rspecs 中直接访问。

所以,首先在 rspecs 中创建一个支付对象,并像我在上面的解决方案中那样let使用它块before

于 2017-09-27T11:38:41.953 回答
2

您在 specs 中的 @payment 实际上是一个完全不同的变量,它是 specs 类的一部分,而不是控制器。我可能错了,但这是我对您发布的代码部分的假设 - 添加规范代码以获取更多信息。作为解决方案,可以使用“存根任何实例”

Payment.any_instance.stub(:do_something).and_return(:smthing)

更复杂的方法 - 使用双打

于 2017-09-27T11:37:01.737 回答