我需要验证我的类的任何实例是否接收到某个方法,但我不在乎是否有很多实例接收它(它们应该接收)。
我试过这样:
expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once)
但显然,它只允许单个实例多次接收该方法,但不允许不同的实例。
有没有办法做到这一点?
我需要验证我的类的任何实例是否接收到某个方法,但我不在乎是否有很多实例接收它(它们应该接收)。
我试过这样:
expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once)
但显然,它只允许单个实例多次接收该方法,但不允许不同的实例。
有没有办法做到这一点?
如果您需要忍受代码异味,这个 rspec-mocks Github 问题提出了一个解决方案:
receive_count = 0
allow_any_instance_of(MyClass).to receive(:my_method) { receive_count += 1 }
# Code to test here.
expect(receive_count).to be > 0
这是 rspec-mocks 中的一个已知问题。来自v3.4Any instance
文档:
rspec-mocks API 是为单个对象实例设计的,但此功能适用于整个对象类。因此,存在一些语义上令人困惑的边缘情况。例如,
expect_any_instance_of(Widget).to receive(:name).twice
不清楚一个特定实例是否预期会收到两次名称,或者是否预期两次收到总数。(是前者。)
此外
使用此功能通常是一种设计气味。可能是您的测试试图做的太多,或者被测对象太复杂。
您有什么方法可以重构您的测试或应用程序代码以避免“令人困惑的边缘情况”吗?也许通过构建一个测试替身并期望它接收消息?