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
调用另一次(或者反过来)会怎么样?