Se moquant d'une classe: Maquette() ou patch()?
Je suis en utilisant maquette avec Python et je me demandais laquelle de ces deux approches est la mieux (lire: plus pythonic).
De la méthode: il suffit de créer un objet fantaisie et l'utiliser. Le code ressemble à:
def test_one (self):
mock = Mock()
mock.method.return_value = True
self.sut.something(mock) # This should called mock.method and checks the result.
self.assertTrue(mock.method.called)
Méthode deux: patch pour créer une maquette. Le code ressemble à:
@patch("MyClass")
def test_two (self, mock):
instance = mock.return_value
instance.method.return_value = True
self.sut.something(instance) # This should called mock.method and checks the result.
self.assertTrue(instance.method.called)
Les deux méthodes de faire la même chose. Je ne suis pas sûr de la différence.
Quelqu'un pourrait-il m'éclairer?
- En tant que personne qui n'ont jamais essayé soit de se Moquer() ou le patch, j'ai l'impression que la première version est plus claire et montre ce que vous voulez faire, même si je n'ai pas de compréhension de la différence réelle. Je ne sais pas si c'est utile ou pas, mais j'ai pensé qu'il pourrait être utile de transmettre ce qu'un non-initié, le programmeur peut se sentir.
- Je vous remercie pour votre commentaire. Il est utile en effet.
Vous devez vous connecter pour publier un commentaire.
se moquer.patch
est un très très différent bestiole quemock.Mock
.patch
remplace la classe avec un objet fantaisie et vous permet de travailler avec la maquette de l'instance. Regardez cet extrait:patch
remplaceMyClass
dans une manière qui vous permet de contrôler l'utilisation de la classe dans les fonctions que vous appelez. Une fois que vous patch une classe, les références à la classe sont complètement remplacées par la fantaisie de l'instance.mock.patch
est généralement utilisé lorsque vous testez quelque chose qui crée une nouvelle instance d'une classe à l'intérieur de l'essai.mock.Mock
instances sont plus clairs et sont privilégiées. Si votreself.sut.something
méthode créée une instance deMyClass
au lieu de recevoir une instance en tant que paramètre, puismock.patch
serait approprié ici.J'ai un Vidéo YouTube sur ce.
Réponse courte: Utilisation
mock
lorsque vous êtes de passage dans la chose que vous voulez est moqué, etpatch
si vous n'êtes pas. Des deux, la maquette est fortement conseillée, car elle signifie que vous êtes à l'écriture de code avec une bonne injection de dépendance.Exemple stupide: