2016-07-04 8 views
-1

Ich versuche, Mock.Patch zu verwenden, um meinen Code zu testen, aber ich bekomme ein seltsames Ergebnis. Dies ist der wichtige Teil des Codes:Rückgabewert Probleme mit Unittest patch() in Python

@mock.patch('benchmark.scenarios.networking.feature.ssh') 
@mock.patch('benchmark.scenarios.networking.feature.subprocess.call') 
def test_run_for_success(self, mock_subprocess, mock_ssh): 
    mock_ssh.SSH().execute.return_value = (0, '100', '') 
    mock_subprocess.call().return_value = 'mocked!' 

    result = {} 
    self.feature.run(result) 

Wenn ich ssh in meinem Code ausführen, ich den zurückgegebenen Wert erhalten: (0, '100', ''), gut! Allerdings, wenn ich subprocess.call() laufen bekomme ich als Rückgabewert:

<MagicMock name='subprocess.call()' id='139806699670096'> 

Was mache ich falsch? Ich würde gerne "verspottet" werden! als zurückgegebener Wert

+0

Ihre Mock ist 'benchmark.scenarios.networking.feature.subprocess.call', dann bist du die' call' Methode auf das spöttische - Sie müssen nur die 'call' einmal und der Schein sollte mit dem Import übereinstimmen. – jonrsharpe

Antwort

2

Sie verwenden mock.return_value falsch und auf dem falschen Objekt; Wenn Sie den Rückgabewert für foo() festlegen möchten, verwenden Sie foo.return_value, nicht foo().return_value. Darüber hinaus mock_subprocess Punkte auf subprocess.callbereits, nicht auf die call Attribut auf die Suche!

Mit anderen Worten, nicht Anruf das Mock-Objekt, wenn return_value Einstellung, und verwenden Sie mock_subprocessdirekt:

mock_subprocess.return_value = 'mocked!' 

Sie möchten mock_subprocess-mock_subprocess_call oder ähnlich benennen, dass es offensichtlich zu machen was du gepatcht hast.

Sie haben einen Rückgabewert für subprocess.call.call()(), nicht subprocess.call() festgelegt.

Demo:

>>> import subprocess 
>>> from unittest.mock import patch 
>>> with patch('subprocess.call') as mock_subprocess: 
...  mock_subprocess.call().return_value = 'mocked!' 
...  print(subprocess.call(), subprocess.call.call()()) 
...  mock_subprocess.return_value = 'mocked!' 
...  print(subprocess.call()) 
... 
<MagicMock name='call()' id='4557171960'> mocked! 
mocked!