Per spiegare ulteriormente @ risposta di panico, supponiamo di avere una classe libro:
require 'minitest/mock'
class Book; end
In primo luogo, creare un'istanza stub Libro, e renderlo restituire il titolo desiderato (qualsiasi numero di volte):
book_instance_stub = Minitest::Mock.new
def book_instance_stub.title
desired_title = 'War and Peace'
return_value = desired_title
return_value
end
Poi, rendono la classe Book istanziare il tuo libro esempio stub (solo e sempre, all'interno del blocco di codice seguente):
return_value = book_instance_stub
method_to_redefine = :new
Book.stub method_to_redefine, return_value do
All'interno di questo blocco di codice (solo), il metodo Book :: new viene stubato. Proviamo:
some_book = Book.new
another_book = Book.new
puts some_book.title #=> "War and Peace"
puts some_book.title #=> "War and Peace"
end
Oppure, più conciso:
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"
puts book.title #=> "War and Peace"
end
In alternativa, è possibile installare l'estensione gemma Minitest 'Minitest-stub_any_instance'. (Nota: in questo modo, il metodo titolo Book # deve esistere prima di stub esso.) Ora, si può dire più semplicemente:
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"
puts book.title #=> "War and Peace"
end
Se si desidera verificare che il titolo Book # viene richiamato un certo numero di volte , quindi eseguire:
require 'minitest/mock'
class Book; end
desired_title = 'War and Peace'
return_value = desired_title
method = :title
book_instance_stub = Minitest::Mock.new
number_of_title_invocations = 2
number_of_title_invocations.times do
book_instance_stub.expect method, return_value
end
return_value = book_instance_stub
method_to_redefine = :new
Book.stub method_to_redefine, return_value do
some_book = Book.new
puts some_book.title #=> "War and Peace"
puts some_book.title #=> "War and Peace"
end
book_instance_stub.verify
Così, per un particolare esempio, richiamando il metodo stubbed più volte quella specificata solleva MockExpectationError: No more expects available
.
Inoltre, per qualsiasi istanza particolare, richiamando il metodo di stubato un numero di volte inferiore a quello specificato, viene generato il valore MockExpectationError: expected title()
, ma solo se in seguito si richiama #verify su tale istanza.
Sembra "Libro".stub: title, "War and Peace" 'funziona solo se' title' è una classe_metodo di 'Book' Non riesco a riprodurre lo stesso comportamento di' any_instance', l'errore 'NameError: metodo undefined' title 'per 'Book' ' – fguillen
Titolo del metodo non definito 'per Book' – qichunren
' stub' opera su 'metaclass = class << self; se stesso; end' come per [l'origine della libreria di simulazione] (https://github.com/seattlerb/minitest/blob/master/lib/minitest/mock.rb#L170) in MiniTest. Quindi sembra che tu possa solo eliminare i metodi singleton; Altrimenti vai con un oggetto finto completo. –