@panic's answerをさらに説明するために、 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 拡張機能 gem をインストールすることもできます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