Nous utilisons Mock pour python depuis un certain temps.
Maintenant, nous avons une situation dans laquelle nous voulons nous moquer d'une fonction
def foo(self, my_param):
#do something here, assign something to my_result
return my_result
Normalement, la façon de se moquer de cela serait (en supposant que foo fasse partie d'un objet)
self.foo = MagicMock(return_value="mocked!")
Même si j'appelle foo () plusieurs fois, je peux utiliser
self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])
Maintenant, je suis confronté à une situation dans laquelle je souhaite renvoyer une valeur fixe lorsque le paramètre d'entrée a une valeur particulière. Donc si disons que "mon_param" est égal à "quelque chose" alors je veux retourner "mon_cool_mock"
Cela semble être disponible sur mockito pour python
when(dummy).foo("something").thenReturn("my_cool_mock")
J'ai cherché comment réaliser la même chose avec Mock sans succès?
Des idées?
python
unit-testing
mocking
mockito
Juan Antonio Gomez Moriano
la source
la source
monkeypatch
. Monkeypatch est plus destiné à "remplacer cette fonction pour des raisons de test", alors que Mock est ce que vous utilisez lorsque vous souhaitez également vérifiermock_calls
ou faire des affirmations sur ce avec quoi il a été appelé, etc. Il y a une place pour les deux, et j'utilise souvent les deux à des moments différents dans un fichier de test donné.Réponses:
http://www.voidspace.org.uk/python/mock/mock.html#calling
la source
side effect
c'est le terme exact: en.wikipedia.org/wiki/Side_effect_(computer_science)CallableMixin.side_effect
, mais que la fonction distincte définie dans l'exemple a le même nom.Comme indiqué à l' objet Python Mock avec la méthode appelée plusieurs fois
Une solution est d'écrire mon propre side_effect
Ça fait l'affaire
la source
L'effet secondaire prend une fonction (qui peut également être une fonction lambda ), donc pour les cas simples, vous pouvez utiliser:
la source
J'ai fini par chercher ici " comment simuler une fonction basée sur des arguments d'entrée " et j'ai finalement résolu ce problème en créant une simple fonction aux:
Maintenant:
J'espère que cela aidera quelqu'un!
la source
Vous pouvez également utiliser
partial
fromfunctools
si vous souhaitez utiliser une fonction qui prend des paramètres mais que la fonction dont vous vous moquez ne le fait pas. Par exemple, comme ceci:Cela renverra un appelable qui n'accepte pas les paramètres (comme timezone.now () de Django), mais ma fonction mock_year le fait.
la source
got multiple values for argument
.Juste pour montrer une autre façon de le faire:
la source
Vous pouvez également utiliser
@mock.patch.object
:Disons qu'un module
my_module.py
utilisepandas
pour lire à partir d'une base de données et que nous aimerions tester ce module par unepd.read_sql_table
méthode moqueuse (qui prendtable_name
comme argument).Ce que vous pouvez faire est de créer (à l'intérieur de votre test) une
db_mock
méthode qui renvoie différents objets en fonction de l'argument fourni:Dans votre fonction de test, vous faites ensuite:
la source
Si vous «souhaitez renvoyer une valeur fixe lorsque le paramètre d'entrée a une valeur particulière» , peut-être n'avez-vous même pas besoin d'un simulacre et pourriez utiliser a
dict
avec saget
méthode:Cela fonctionne bien lorsque la sortie de votre faux est un mappage d'entrée. Quand c'est une fonction d'entrée, je suggère d'utiliser
side_effect
selon la réponse d' Amber .Vous pouvez également utiliser une combinaison des deux si vous souhaitez conserver
Mock
les capacités de (assert_called_once
,call_count
etc):la source
Je sais que c'est une question assez ancienne, pourrait aider comme amélioration en utilisant python lamdba
la source