RSpec 似乎按顺序匹配方法接收到的消息。我不确定如何使以下代码工作:
allow(a).to receive(:f)
expect(a).to receive(:f).with(2)
a.f(1)
a.f(2)
a.f(3)
我问的原因是
a.f
的一些调用是由我的代码上层控制的,所以我不能对这些方法调用添加期望。
RSpec 间谍是测试这种情况的一种方法。要监视某个方法,请使用
allow
对其进行存根,除了方法名称之外没有任何限制,调用该方法,然后 expect
随后调用确切的方法。
例如:
allow(a).to receive(:f)
a.f(2)
a.f(1)
a.f(3)
expect(a).to have_received(:f).exactly(3).times
[1, 2, 3].each do |arg|
expect(a).to have_received(:f).with(arg)
end
如您所见,这种等待方法调用的方式不会强加顺序。