18

我需要验证我的类的任何实例是否接收到某个方法,但我不在乎是否有很多实例接收它(它们应该接收)。

我试过这样:

expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once)

但显然,它只允许单个实例多次接收该方法,但不允许不同的实例。

有没有办法做到这一点?

4

2 回答 2

24

如果您需要忍受代码异味,这个 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
于 2018-05-07T16:46:48.227 回答
10

这是 rspec-mocks 中的一个已知问题。来自v3.4Any instance文档:

rspec-mocks API 是为单个对象实例设计的,但此功能适用于整个对象类。因此,存在一些语义上令人困惑的边缘情况。例如,expect_any_instance_of(Widget).to receive(:name).twice不清楚一个特定实例是否预期会收到两次名称,或者是否预期两次收到总数。(是前者。)

此外

使用此功能通常是一种设计气味。可能是您的测试试图做的太多,或者被测对象太复杂。

您有什么方法可以重构您的测试或应用程序代码以避免“令人困惑的边缘情况”吗?也许通过构建一个测试替身并期望它接收消息?

于 2016-02-10T19:55:35.100 回答