subprocesso de mock.Popen depende do estilo de importação

Ao tentar zombar do Popen, só posso obtê-lo com êxito se a importação do subprocesso corresponder no código do teste de unidade e no código do módulo principal.

Dado o seguinte 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

e código de teste de unidade a seguir 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 alguma razão, o Popen não está sendo ridicularizado, devido ao estilo de importação ser diferente entre os dois módulos python, e a execução do teste sempre gera uma exceção.

Se eu alterar listdir.py para importar todos os subprocessos, por exemplo,

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

Em seguida, "output" é retornado no teste.

Alguém se preocupa em esclarecer o porquê, minha preferência seria importar subprocesso Popen, Pipe nos dois módulos, mas não consigo zombar disso.

questionAnswers(1)

yourAnswerToTheQuestion