Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Minitest::Mock#期望没有特定顺序?_Ruby On Rails_Ruby_Minitest - Fatal编程技术网

Ruby on rails Minitest::Mock#期望没有特定顺序?

Ruby on rails Minitest::Mock#期望没有特定顺序?,ruby-on-rails,ruby,minitest,Ruby On Rails,Ruby,Minitest,假设我有一门课: class Foo def process MyModel.where(id: [1,3,5,7]).each do |my_model| ExternalService.dispatch(my_modal.id) end end end 我想测试一下: class FooTest < ActiveSupport::TestCase def process_test external_service_mock = Mini

假设我有一门课:

class Foo
  def process
    MyModel.where(id: [1,3,5,7]).each do |my_model|
      ExternalService.dispatch(my_modal.id)
    end
  end
end
我想测试一下:

class FooTest < ActiveSupport::TestCase
  def process_test
    external_service_mock = MiniTest::Mock.new
    [1,3,5,7].each do |id|
      external_service_mock.expect(:call, true, id)
    end

    ExternalService.stub(:dispatch, events_mock) do
      Foo.new.process
    end
    external_service_mock.verify
  end
end
class-FooTest
但是,
#expect
强制执行以下调用的顺序与调用
#expect
的顺序相同。这对我不好,因为我没有信心,数据库返回结果的顺序是什么


我怎样才能解决这个问题?有没有一种方法可以在没有特定顺序的情况下期待呼叫?

尝试使用Set

require 'set'
xs = Set[3,5,7,9]

@cat = Minitest::Mock.new
@cat.expect :meow?, true, [xs]
@cat.meow? 7 # => ok...
@cat.expect :meow?, true, [xs]
@cat.meow? 4 # => boom!
或者,一个不太具体的选项:

假设mock返回的值不是参数值的函数,那么您可以在设置mock时为参数指定一个类。下面是一个猫的例子,它希望用任意整数调用四次
meow?

@cat = Minitest::Mock.new
4.times { @cat.expect(:meow?, true, [Integer]) }

# Yep, I can meow thrice.
@cat.meow? 3 # => true

# Mope, I can't meow a potato number of times.
@cat.meow? "potato" # => MockExpectationError

这不是一个理想的解决方案,但在这种情况下,您可以使顺序一致-即
其中(id:[1,3,5,7])。顺序(:id)
。但在更复杂的情况下,这可能并不实用。在我的情况下,我真的不需要排序,因此仅为通过测试而添加
order
并不是最好的解决方案。这会降低测试的安全性。我想让它测试精确的参数值,而不是任何给定的类。是的,我添加了一个使用集合的示例。我感到惊讶的是,它可以在不干扰事情的情况下工作。对于只需要一个参数的方法来说效果很好。如果用
3,5
调用一次
喵喵叫?
,用
7,9
调用另一次(或者反过来)会怎么样?