Object.any_instance should_receive vs Expect()接收


75

以下代码段按预期工作:

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:


155

现在有一个expect_any_instance_of处理方法不很完善的方法,称为any_instance特殊情况。您应该使用:

expect_any_instance_of(Object).to receive(:subscribe)

谷歌expect_any_instance_of获取更多信息。


+1表示“记录不充分”。仍然如此。rubydoc.info/gems/rspec-mocks/RSpec/Mocks/…–
johngraham

我一直在用allow_any_instance_of。它是此方法的别名吗?
rubyprince

1
@rubyprince它们是不同的,允许方法对行为进行存根并期望对行为进行测试。例如,allow(my_obj).to receive(:method_name).and_return(true)存根,my_obj.method_name()因此如果在测试中调用它,它只会返回trueexpect(my_obj).to receive(:method_name).and_return(true)不会改变任何行为,但是会设置一个测试期望值,使其my_obj.method_name()在测试的稍后阶段未调用或未返回true时失败。
Saigo

谢谢@Saigo。现在有意义。
rubyprince

2
不建议使用此语法。在今天的语法中,如何执行此操作有任何提示吗?
iGbanam

1

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)

祝好运!🙏🏽

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.