Чтобы еще больше пояснить ответ @ panic, предположим, что у вас есть класс Book:
require 'minitest/mock'
class Book; end
Сначала создайте заглушку экземпляра книги и заставьте ее возвращать желаемый заголовок (любое количество раз):
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
Таким образом, для любого конкретного экземпляра вызов заглушенного метода больше раз, чем указано, вызывает MockExpectationError: No more expects available
.
Кроме того, для любого конкретного экземпляра вызов заглушенного метода меньше раз, чем указано, вызывает MockExpectationError: expected title()
, но только если вы вызываете #verify
в этом экземпляре в этот момент.
person
MarkDBlackwell
schedule
23.06.2016