J'ai une méthode à l'essai qui ressemble à ceci:Mock une méthode d'instance avec une certaine valeur de retour?
def execute_update(self):
"""Execute an update."""
p = subprocess.Popen(['command'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
try:
stdout, stderr = p.communicate()
if p.returncode == 0:
# successful update, notify
self.logger.info("Successfully updated.")
else:
# failed update, notify
self.logger.error("Unable to update (code {returncode}):\n{output}".format(
returncode=p.returncode, output=stdout))
except KeyboardInterrupt as e:
# terminate the process
p.terminate()
raise e
Je tente de tester son invocation de Popen et son invocation des fonctions d'enregistrement dans une méthode d'essai unittest.TestCase
avec mock
:
@mock.patch.object(subprocess.Popen, 'communicate', autospec=True)
@mock.patch('updateservice.subprocess.Popen', autospec=True)
def test_fetch_metadata(self, mock_popen, mock_communicate):
"""Test that we can fetch metadata correctly."""
mock_communicate.return_value = ("OUT", "ERR")
mock_popen.returncode = 0
self.reference.execute_update()
# other asserts
La dernière ligne échoue avec:
stdout, stderr = p.communicate()
ValueError: need more than 0 values to unpack
Qu'est-ce que je fais mal? J'ai les exigences suivantes:
- Test que le constructeur à
subprocess.Popen
a été appelé avec les bonnes valeurs. - Vérifiez que les appels de journalisation s'exécutent avec le code de sortie et de retour du processus.
Le numéro deux est assez facile, je suis juste injecter un MagicMock comme l'objet enregistreur, mais je "m de la difficulté avec le numéro un.
Essayez de définir 'return_value' dans votre ligne' @ mock.patch.object'. – kindall
J'ai essayé cela, même erreur. –
comme il est dit dans l'erreur que vous attrapez deux valeurs dans le retour ... à cause de cela, votre valeur de retour doit être un tuple, par exemple. (0,0) – Aquiles