假设我有方法 #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/

10-14 07:53