0

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

(piped||arguments||approach) 不起作用。是否存在用于检查参数是否匹配数组元素的现有 rspec 匹配器?还是编写自定义匹配器是可行的方式?

4

2 回答 2

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))

会更适合您的规格吗?

于 2018-03-07T15:21:39.450 回答
0

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

expect(BarGetter).to receive(:fetch_bar) do |arg|
  expect([condition1, condition2, condition3]).to include(arg)
end
于 2018-03-12T10:35:56.157 回答