Просто для дальнейшего объяснения @ ответа паники , давайте предположим, что у вас есть класс Book:
require 'minitest/mock'
class Book; end
Сначала создайте заглушку экземпляра Book и сделайте так, чтобы она возвращала желаемый заголовок (любое количество раз):
book_instance_stub = Minitest::Mock.new
def book_instance_stub.title
desired_title = 'War and Peace'
return_value = desired_title
return_value
end
Затем заставьте класс Book создать экземпляр своей заглушки экземпляра Book (только и всегда, в следующем блоке кода):
method_to_redefine = :new
return_value = book_instance_stub
Book.stub method_to_redefine, return_value do
...
В этом блоке кода (только) метод Book::new
является заглушкой. Давайте попробуем это:
...
some_book = Book.new
another_book = Book.new
puts some_book.title #=> "War and Peace"
end
Или, кратко:
require 'minitest/mock'
class Book; end
instance = Minitest::Mock.new
def instance.title() 'War and Peace' end
Book.stub :new, instance do
book = Book.new
another_book = Book.new
puts book.title #=> "War and Peace"
end
Кроме того, вы можете установить гем расширения Minitest minitest-stub_any_instance
. (Примечание: при использовании этого подхода метод Book#title
должен существовать до того, как вы его заглушите.) Теперь вы можете сказать более просто:
require 'minitest/stub_any_instance'
class Book; def title() end end
desired_title = 'War and Peace'
Book.stub_any_instance :title, desired_title do
book = Book.new
another_book = Book.new
puts book.title #=> "War and Peace"
end
Если вы хотите убедиться, что Book#title
вызывается определенное количество раз, выполните:
require 'minitest/mock'
class Book; end
book_instance_stub = Minitest::Mock.new
method = :title
desired_title = 'War and Peace'
return_value = desired_title
number_of_title_invocations = 2
number_of_title_invocations.times do
book_instance_stub.expect method, return_value
end
method_to_redefine = :new
return_value = book_instance_stub
Book.stub method_to_redefine, return_value do
some_book = Book.new
puts some_book.title #=> "War and Peace"
# And again:
puts some_book.title #=> "War and Peace"
end
book_instance_stub.verify
Таким образом, для любого конкретного случая вызов метода stubbed больше раз, чем указано, вызывает MockExpectationError: No more expects available
.
Кроме того, для любого конкретного экземпляра, вызвав метод stubbed меньше раз, чем указано, выдается MockExpectationError: expected title()
, но только если вы вызываете #verify
для этого экземпляра в этой точке.