Rspec的预期(例如)接收方法无法正常运行

问题描述:

试图符合规格,如果do_something方法被调用时
#controller file 
def update 
    @payment = Payment.find_by(reference_id: params[:reference_id]) 
    if @payment.update(update_params) 
    @payment.do_something 
    end 
end 

,通过Rspec的预期(例如)接收方法无法正常运行

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

它说

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

do_something是我付款类。它实际上被称为,但rspec说不。

任何想法?在此先感谢

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

一个更复杂的方法 - 使用双打

首先需要存根在控制器中的线,以便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中直接访问。

因此,首先利用let创建rspecs支付对象,并用它before阻止像我在上面解决方案做到了