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匹配器?或者正在编写自定义匹配器?
答案 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