Rspec 对象。任何\u实例都应该\u接收vs expect()接收

Rspec 对象。任何\u实例都应该\u接收vs expect()接收,rspec,rspec2,rspec-rails,Rspec,Rspec2,Rspec Rails,以下代码按预期工作: Object.any_instance.should_receive(:subscribe) 但当使用新的rspec预期时,它不起作用: expect(Object.any_instance).to receive(:subscribe) 错误是: expected: 1 time with any arguments received: 0 times with any arguments 如何使expect()接收工作正常?现在有一个没有很好文档记录的方法,名为e

以下代码按预期工作:

Object.any_instance.should_receive(:subscribe)
但当使用新的rspec预期时,它不起作用:

expect(Object.any_instance).to receive(:subscribe)
错误是:

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

如何使expect()接收工作正常?

现在有一个没有很好文档记录的方法,名为
expect\u any\u instance\u of
,它处理
any\u instance
特殊情况。你应使用:

expect_any_instance_of(Object).to receive(:subscribe)

谷歌
expect\u any\u instance\u of
了解更多信息。

只是提醒一下,
expect\u any\u instance\u of
现在被认为是不推荐的行为。建议的替代方法是使用
instance\u double
方法创建类的模拟实例,并期望调用该实例double,如该链接中所述

Jon的方法是首选的(因为它可以作为一种通用的测试辅助方法)。但是,如果您发现这一点令人困惑,希望您的示例案例的这个实现能够帮助您理解预期的方法:

mock_object=instance_double(object)#创建mock实例
允许(MyModule::MyClass).接收(:new).并返回(mock_object)#在调用构造函数时始终返回此mock实例
期望(mock_对象)。接收(:subscribe)

祝你好运+1表示“没有很好的记录”。情况仍然如此。我一直在使用
允许任何
的实例。它是这个方法的别名吗?@rubyprince它们不同,允许方法存根行为和期望方法测试行为。例如,
allow(my_obj).to receive(:method_name).and_return(true)
stubs
my_obj.method_name()
因此,如果在测试中调用它,它只返回
true
expect(my_obj).to receive(:method_name).and_return(true)
不会改变任何行为,但是如果
my_obj.method_name()
在测试后期未被调用或未返回true,则设置测试预期失败。谢谢@Saigo。现在有意义了。此语法已被弃用。在今天的语法中有没有关于如何做到这一点的提示?