Comment simuler une fonction définie dans un module d'un paquet?
J'ai une structure suivante:
|-- dirBar
| |-- __init__.py
| |-- bar.py
|-- foo.py
`-- test.py
bar.py
def returnBar():
return 'Bar'
foo.py
from dirBar.bar import returnBar
def printFoo():
print returnBar()
test.py
from mock import Mock
from foo import printFoo
from dirBar import bar
bar.returnBar = Mock(return_value='Foo')
printFoo()
le résultat de python test.py
est Bar
.
La façon de se moquer de l' printBar
pour le faire revenir Foo
de sorte que printFoo
va l'imprimer?
EDIT: Sans modifier les autres fichiers test.py
Vous devez vous connecter pour publier un commentaire.
Je devine que vous allez vous moquer de la fonction
returnBar
, vous souhaitez utiliserpatch
décorateur:from dirBar.bar import returnBar
dansfoo.py
, les moqueries des besoins de patch à l'importation commefoo.returnBar
, pas commedirBar.bar.returnBar
.Il suffit d'importer le
bar
module avant de lefoo
module et de s'en moquer:Lorsque vous importez les
returnBar
dansfoo.py
, vous êtes liant la valeur du module à une variable appeléereturnBar
. Cette variable est locale est donc mis à la fermeture de laprintFoo()
fonction lorsquefoo
est importé et les valeurs de la fermeture ne peut pas être mis à jour par le code de outiside il. Donc, il doit avoir la nouvelle valeur (qui est, les moqueries de la fonction) avant l'importation defoo
.MODIFIER: la solution précédente workis mais n'est pas robuste car elle dépend de la commande à l'importation. Qui n'est pas très idéal. Une autre solution (qui m'a eu lieu après la première) est d'importer le
bar
module dansfoo.py
au lieu d'importer uniquement lesreturnBar()
fonction:Cela fonctionne parce que le
returnBar()
est maintenant récupérées directement à partir de labar
module à la place de la fermeture. Donc, si je mettre à jour le module, la nouvelle fonction sera récupéré.Une autre façon de traiter ces cas est d'utiliser une injection de dépendance.
Un moyen facile de le faire en python est d'utiliser la magie
**kwargs
:foo.py
test.py
cela va conduire à un code de tests (et d'augmenter la modularité/réutilisabilité).