Rspec期望(实例)接收方法不按预期工作

时间:2017-09-27 10:56:48

标签: ruby-on-rails ruby rspec controller rspec-expectations

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

当试图通过

调用do_something方法时
expected: 1 time with any arguments
received: 0 times with any arguments

它说

{
  "element" : value,
  "id" : value,
  "total" : []
}
{
  "element" : value,
  "id" : value,
  "total: []
}

do_something在我的付款类中。它实际上被称为,但rspec说没有。

有什么想法吗?提前谢谢

2 个答案:

答案 0 :(得分:1)

首先,您需要在控制器中存根行以便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

答案 1 :(得分:0)

你的@payment in specs实际上是一个完全不同的变量,它是specs类的一部分,而不是控制器。我可能错了,但这是我发布的代码部分的假设 - 添加规范代码以获取更多信息。 在解决方案中,可以使用'stub any instance'

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

更复杂的方法 - 使用双打