Mat*_*Mat 10 rspec ruby-on-rails rspec-mocks
我需要验证我的类的任何实例都接收到某种方法,但我不关心是否有许多实例接收它(它们应该是).
我试过这样的:
expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once)
Run Code Online (Sandbox Code Playgroud)
但显然,它只允许单个实例多次接收方法,但不允许不同的实例.
有没有办法实现这一目标?
这是rspec-mocks中的一个已知问题.从V3.4文档上Any instance
:
rspec-mocks API是为单个对象实例设计的,但此功能适用于整个对象类.结果,存在一些语义上令人困惑的边缘情况.例如,
expect_any_instance_of(Widget).to receive(:name).twice
目前尚不清楚特定实例是否需要两次接收名称,或者是否预期接收到两个名称.(这是前者.)
此外
使用此功能通常是一种设计气味.可能是您的测试试图做得太多,或者被测对象太复杂了.
您是否有任何方法可以重构您的测试或应用程序代码以避免"令人困惑的边缘情况"?也许通过构建测试双重并期望它接收消息?
如果你需要忍受代码气味,这个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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3800 次 |
最近记录: |