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

时间:2016-05-06 00:51:23

标签: ruby-on-rails ruby unit-testing rspec

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

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

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

2 个答案:

答案 0 :(得分:9)

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

正如您所看到的,这种期待方法调用的方式并没有强加订单。

答案 1 :(得分:0)

尝试这种方式:

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

您可以找到更多示例here