以下代码段按预期工作:
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()来接收它?
Answers:
现在有一个expect_any_instance_of
处理方法不很完善的方法,称为any_instance
特殊情况。您应该使用:
expect_any_instance_of(Object).to receive(:subscribe)
谷歌expect_any_instance_of
获取更多信息。
allow_any_instance_of
。它是此方法的别名吗?
allow(my_obj).to receive(:method_name).and_return(true)
存根,my_obj.method_name()
因此如果在测试中调用它,它只会返回true
。 expect(my_obj).to receive(:method_name).and_return(true)
不会改变任何行为,但是会设置一个测试期望值,使其my_obj.method_name()
在测试的稍后阶段未调用或未返回true时失败。
expect_any_instance_of
根据Jon Rowe(关键rspec贡献者)的说法,现在只是提神了。建议的替代方法是使用该instance_double
方法创建类的模拟实例,并期望对该实例的调用加倍,如该链接中所述。
首选Jon方法(因为它可以用作通用的测试辅助方法)。但是,如果您感到困惑,希望此示例示例的实现可以帮助您理解预期的方法:
mock_object = instance_double(Object) # create mock instance
allow(MyModule::MyClass).to receive(:new).and_return(mock_object) # always return this mock instance when constructor is invoked
expect(mock_object).to receive(:subscribe)
祝好运!🙏🏽