Ich habe eine Methode unter Test, der wie folgt aussieht:Mock eine Instanzmethode mit einem bestimmten Rückgabewert?
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
Ich versuche, mit mock
ihren Aufruf von Popen und seinen Aufruf der Logging-Funktionen in einem unittest.TestCase
Testverfahren zu testen:
@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
Die letzte Zeile nicht mit:
stdout, stderr = p.communicate()
ValueError: need more than 0 values to unpack
Was mache ich falsch? Ich habe folgende Anforderungen:
- -Test, dass der Konstruktor
subprocess.Popen
mit den richtigen Werten aufgerufen wurde. - Testen Sie, dass die Protokollierungsaufrufe mit dem Ausgabe- und Rückgabecode des Prozesses ausgeführt werden.
Nummer zwei ist leicht genug, ich bin die Injektion nur ein MagicMock als Logger-Objekt, aber ich "m Probleme, mit der Nummer eins.
Versuchen Sie, den 'return_value' in Ihrer Zeile' @ mock.patch.object' zu setzen. – kindall
Versucht, denselben Fehler. –
wie es in dem Fehler gesagt wird, fangen Sie zwei Werte in der Rückgabe ... deshalb muss Ihr return_value ein Tupel sein zB. (0,0) – Aquiles