假设我有方法 #sum
,它接受一个数组并计算所有元素的总和。我在戳它:
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)
正是您想要的,因此您可以将其传递给:
expect(calculation_service).to receive(:sum?).with(contain_exactly(1, 2, 3)) { 6 }
然而,“with contains only 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/