Come deridere un'importazione, (mock AB)?
Il modulo A include l'importazione B nella parte superiore.
Semplice, prendi in giro la libreria in sys.modules prima che venga importata:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
e quindi, purché A
non si basi su tipi specifici di dati restituiti dagli oggetti di B:
import A
dovrebbe funzionare.
Puoi anche deridere import A.B
:
Funziona anche se hai sottomoduli, ma ti consigliamo di prendere in giro ogni modulo. Di 'che hai questo:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Per deridere, fai semplicemente quanto segue prima di importare il modulo che contiene quanto sopra:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(La mia esperienza: ho avuto una dipendenza che funziona su una piattaforma, Windows, ma non ha funzionato su Linux, dove abbiamo eseguito i nostri test giornalieri. Quindi ho dovuto deridere la dipendenza per i nostri test. Fortunatamente era una scatola nera, quindi Non ho avuto bisogno di creare molta interazione.)
Effetti collaterali beffardi
Addendum: In realtà, avevo bisogno di simulare un effetto collaterale che ha richiesto del tempo. Quindi avevo bisogno del metodo di un oggetto per dormire per un secondo. Funzionerebbe così:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
# setup the side-effect:
from time import sleep
def sleep_one(*args):
sleep(1)
# this gives us the mock objects that will be used
from foo.bar import MyObject
my_instance = MyObject()
# mock the method!
my_instance.method_that_takes_time = mock.MagicMock(side_effect=sleep_one)
E quindi l'esecuzione del codice richiede del tempo, proprio come il metodo reale.
Mock
non correggerà alcuni attributi magici (__%s__
) come__name__
.