subproceso burlón. La apertura depende del estilo de importación

Cuando intento burlarme de Popen, solo puedo lograr que tenga éxito si la importación del subproceso coincide tanto en el código de prueba de la unidad como en el código del módulo principal.

Dado el siguiente módulo 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

y siguiente código de prueba de unidad 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")

Por alguna razón, no se está burlando de Popen, debido a que el estilo de importación es diferente entre los dos módulos de Python, y la ejecución de la prueba siempre genera una excepción.

Si cambio listdir.py para importar todos los subprocesos, p.

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

Luego se devuelve "salida" en la prueba.

A cualquiera le gustaría arrojar algo de luz sobre por qué, mi preferencia sería tener desde el subproceso de importación Popen, Pipe en ambos módulos, pero no puedo hacer que eso se burle.

Respuestas a la pregunta(1)

Su respuesta a la pregunta