Wie verspottet man einen Import (verspottet AB)?
Modul A enthält oben Import B.
Einfach, verspotten Sie einfach die Bibliothek in sys.modules, bevor sie importiert wird:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
und dann, solange A
nicht bestimmte Datentypen von Bs Objekten zurückgegeben werden:
import A
sollte einfach funktionieren.
Sie können auch verspotten import A.B
:
Dies funktioniert auch, wenn Sie Submodule haben, aber Sie möchten jedes Modul verspotten. Angenommen, Sie haben Folgendes:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Führen Sie zum Verspotten einfach die folgenden Schritte aus, bevor das Modul mit den oben genannten Elementen importiert wird:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(Meine Erfahrung: Ich hatte eine Abhängigkeit, die auf einer Plattform, Windows, funktioniert, aber nicht unter Linux, wo wir unsere täglichen Tests ausführen. Also musste ich die Abhängigkeit für unsere Tests verspotten. Zum Glück war es eine Black Box Ich musste nicht viel Interaktion einrichten.)
Verspottende Nebenwirkungen
Nachtrag: Eigentlich musste ich einen Nebeneffekt simulieren, der einige Zeit in Anspruch nahm. Also brauchte ich die Methode eines Objekts, um eine Sekunde lang zu schlafen. Das würde so funktionieren:
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)
Und dann dauert es einige Zeit, bis der Code ausgeführt wird, genau wie bei der eigentlichen Methode.
Mock
einige magische Attribute (__%s__
) wie nicht gepatcht werden__name__
.