ruby-on-rails - RSpec 期望接收带有数组的方法,但顺序无关紧要

标签 ruby-on-rails arrays ruby ruby-on-rails-4 rspec

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

相关文章:

ruby-on-rails - 断言assert_valid_keys的: Unknown key: :order (ArgumentError)

ruby-on-rails - Ruby 顶级常量加载问题

ruby-on-rails - 使用 ruby​​ on rails 的在线音频流

css - Froala Font Awesome 工具栏图标显示为正方形

ruby-on-rails - 使用多个条件对列表进行排序 Ruby on Rails

python - 计算一维 numpy 数组中的局部均值

android - JsonAdapter 无法打印数据

arrays - 根据参数数量在循环中创建数组

ruby - 控制硬件的 TDD web api

ruby-on-rails - 服务器已经在运行。检查…/tmp/pids/server.pid。退出 - rails