mocking subprocess.Popen abhängig vom Importstil
Wenn ich versuche, Popen zu verspotten, kann ich nur Erfolg haben, wenn der Import von Unterprozessen sowohl im Unit-Test-Code als auch im Hauptmodul-Code übereinstimmt.
Gegeben folgendes Modul listdir.py
from subprocess import Popen, PIPE
def listdir(dir):
cmd = ['ls', dir]
pc = Popen(cmd, stdout=PIPE, stderr=PIPE)
out, err = pc.communicate()
if pc.returncode != 0:
raise Exception
return out
und folgenden Unit-Test-Code test_listdir.py
import subprocess
import listdir
import mock
@mock.patch.object(subprocess, 'Popen', autospec=True)
def test_listdir(mock_popen):
mock_popen.return_value.returncode = 0
mock_popen.return_value.communicate.return_value = ("output", "Error")
listdir.listdir("/fake_dir")
Aus irgendeinem Grund wird Popen nicht verspottet, da der Importstil zwischen den beiden Python-Modulen unterschiedlich ist und das Ausführen des Tests immer eine Ausnahme auslöst.
Wenn ich listdir.py ändere, um alle Unterprozesse zu importieren, z. B.
import subprocess
def listdir(dir):
cmd = ['ls', dir]
pc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = pc.communicate()
if pc.returncode != 0:
raise ListingErrorException
return out
Dann wird im Test "output" zurückgegeben.
Jeder möchte etwas Licht ins Dunkel bringen, ich würde es vorziehen, Popen aus einem Teilprozess zu importieren, Pipe in beiden Modulen, aber ich kann das einfach nicht zum Verspotten bringen.