Comment se moquer d'une importation, (mock AB)?
Le module A inclut l'importation B en son sommet.
Facile, simulez simplement la bibliothèque dans sys.modules avant qu'elle ne soit importée:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
et puis, tant que A
ne repose pas sur des types spécifiques de données renvoyées par les objets de B:
import A
devrait juste fonctionner.
Vous pouvez également vous moquer import A.B
:
Cela fonctionne même si vous avez des sous-modules, mais vous voudrez vous moquer de chaque module. Dites que vous avez ceci:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Pour simuler, faites simplement ce qui suit avant que le module qui contient ce qui précède ne soit importé:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(Mon expérience: j'avais une dépendance qui fonctionne sur une plate-forme, Windows, mais qui ne fonctionnait pas sous Linux, où nous exécutons nos tests quotidiens. J'ai donc dû me moquer de la dépendance pour nos tests. Heureusement, c'était une boîte noire, donc Je n'ai pas eu besoin de mettre en place beaucoup d'interaction.)
Effets secondaires moqueurs
Addendum: En fait, j'avais besoin de simuler un effet secondaire qui prenait du temps. J'avais donc besoin de la méthode d'un objet pour dormir une seconde. Cela fonctionnerait comme ceci:
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)
Et puis le code prend un certain temps à s'exécuter, tout comme la vraie méthode.
Mock
certains attributs magiques (__%s__
) comme__name__
.