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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage