在RSpec中,如何期望以任意顺序具有不同参数的多条消息?

问题描述 投票:0回答:2

RSpec 似乎按顺序匹配方法接收到的消息。我不确定如何使以下代码工作:

allow(a).to receive(:f)
expect(a).to receive(:f).with(2)
a.f(1)
a.f(2)
a.f(3)

我问的原因是

a.f
的一些调用是由我的代码上层控制的,所以我不能对这些方法调用添加期望。

ruby-on-rails ruby unit-testing rspec
2个回答
21
投票

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

如您所见,这种等待方法调用的方式不会强加顺序。


2
投票

尝试一下这种可能的方法:

expect(a).to receive(:f).at_most(3).times

您可以在这里找到更多示例

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.