Rspec匹配“any_one_of”?

时间:2018-03-07 14:45:00

标签: ruby rspec argument-matcher

Ruby规范定义了3个instance_doubles:

let(:doub1) { instance_double(Foo) }
let(:doub2) { instance_double(Foo) }
let(:doub3) { instance_double(Foo) }

shared_example旨在确保协作者与任何instance_doubles一起使用:

shared_examples :a_consumer_of_bars do
  it "passes a Foo to the BarGetter" do
    expect(BarGetter).to receive(:fetch_bar)
      .with((condition1 || condition2 || condition3)).at_least(:once)
    subject
  end
end

(管道||参数||方法)不起作用。是否存在用于检查参数是否与数组元素匹配的现有rspec匹配器?或者正在编写自定义匹配器?

2 个答案:

答案 0 :(得分:0)

我会选择自定义匹配器,因为它看起来很不寻常。

piped||arguments||approach显然不起作用,因为它返回第一个非假元素。在您的情况下,管道||顺序中的第一个双打中的任何一个。

此外,它让我想知道为什么你需要这样的东西,你不能完全控制你的规格?为什么要调用BarGetter.fetch_bar而不是确定性地(随机?)选择对象?

也许来自这里的其他匹配者之一https://relishapp.com/rspec/rspec-mocks/v/3-7/docs/setting-constraints/matching-arguments

expect(BarGetter).to receive(:fetch_bar).with(instance_of(Foo))

会更符合您的规格吗?

答案 1 :(得分:0)

当现有的匹配器不能满足您的要求时,您可以将块传递给期望值并对参数运行期望

expect(BarGetter).to receive(:fetch_bar) do |arg|
  expect([condition1, condition2, condition3]).to include(arg)
end