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)
stubsmy_obj.method_name()
因此,如果在测试中调用它,它只返回true
expect(my_obj).to receive(:method_name).and_return(true)
不会改变任何行为,但是如果my_obj.method_name()
在测试后期未被调用或未返回true,则设置测试预期失败。谢谢@Saigo。现在有意义了。此语法已被弃用。在今天的语法中有没有关于如何做到这一点的提示?