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 匹配器用于检查参数是否与数组的元素匹配?还是编写自定义匹配器是要走的路?
我会使用自定义匹配器,因为它看起来很不寻常。
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))
会更适合您的规格吗?
当现有匹配器不能满足您的要求时,您可以将块传递给期望并对参数运行期望
expect(BarGetter).to receive(:fetch_bar) do |arg|
expect([condition1, condition2, condition3]).to include(arg)
end