J'utilise mock avec Python et je me demande laquelle de ces deux approches est la meilleure (lire: plus pythonique).
Première méthode : créez simplement un objet simulé et utilisez-le. Le code ressemble à ceci:
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)
Deuxième méthode : utilisez un patch pour créer une maquette. Le code ressemble à ceci:
@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 font la même chose. Je ne suis pas sûr des différences.
Quelqu'un pourrait-il m'éclairer?
python
unit-testing
mocking
Sardathrion - contre les abus SE
la source
la source
Réponses:
mock.patch
est une créature très très différente de cellemock.Mock
.patch
remplace la classe par un objet fictif et vous permet de travailler avec l'instance fictive. Jetez un œil à cet extrait:patch
remplaceMyClass
d'une manière qui vous permet de contrôler l'utilisation de la classe dans les fonctions que vous appelez. Une fois que vous corrigez une classe, les références à la classe sont complètement remplacées par l'instance fictive.mock.patch
est généralement utilisé lorsque vous testez quelque chose qui crée une nouvelle instance d'une classe à l'intérieur du test.mock.Mock
les instances sont plus claires et sont préférées. Si votreself.sut.something
méthode a créé une instance deMyClass
au lieu de recevoir une instance en tant que paramètre, alors cemock.patch
serait approprié ici.la source
J'ai une vidéo YouTube à ce sujet.
Réponse courte: à utiliser
mock
lorsque vous transmettez ce dont vous voulez vous moquer, etpatch
si vous ne l'êtes pas. Parmi les deux, la simulation est fortement préférée car cela signifie que vous écrivez du code avec une injection de dépendances appropriée.Exemple idiot:
la source