假设我有方法#sum
,它接受一个数组并计算所有元素的总和。我正在 stub :
before do
expect(calculation_service).to receive(:sum?).with([1, 2, 3]) { 6 }
end
不幸的是,我的测试服以随机顺序传递数组。由于引发了该错误:
Failure/Error: subject { do_crazy_stuff! }
#<InstanceDouble() (CalculationService)> received :sum? with unexpected arguments
expected: ([1, 2, 3])
got: ([3, 2, 1])
是否可以忽略数组元素的顺序对方法调用进行 stub ? array_including(1, 2, 3)
无法确保数组大小,因此它可能不是这里的最佳解决方案
最佳答案
您可以将任何 RSpec 匹配器传递给 with
,而 contain_exactly(1, 2, 3)
会完全按照您的意愿进行操作,因此您可以将其传递给 with:
expect(calculation_service).to receive(:sum?).with(contain_exactly(1, 2, 3)) { 6 }
但是,“with contain exactly 1, 2, 3”读起来不太好(失败消息在语法上同样会很尴尬),因此 RSpec 3 提供了解决这两个问题的别名。在这种情况下,您可以使用 a_collection_containing_exactly
:
expect(calculation_service).to receive(:sum?).with(
a_collection_containing_exactly(1, 2, 3)
) { 6 }
关于ruby-on-rails - RSpec 期望接收带有数组的方法,但顺序无关紧要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566530/