Minitest :: Mock # ожидать без определенного заказа? - PullRequest
0 голосов
/ 29 июня 2018

Предположим, у меня есть класс:

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

Однако #expect обеспечивает выполнение следующих вызовов в том же порядке, в котором был вызван #expect. Это не хорошо для меня, потому что я не уверен, в каком порядке БД будет возвращать результаты.

Как я могу решить эту проблему? Есть ли способ expect звонить без определенного заказа?

1 Ответ

0 голосов
/ 29 июня 2018

Попробуйте использовать набор

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!

В качестве альтернативы, менее конкретный вариант:

Учитывая, что значение, возвращаемое макетом, не является функцией значения параметра, возможно, вы можете просто указать класс для параметра при настройке макета. Вот пример кота, который ожидает, что 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
...