Parche no burlándose de un módulo

Estoy tratando de burlarse de subprocess.Popen . Sin embargo, cuando ejecuto el siguiente código, el simulacro se ignora por completo y no estoy seguro de por qué

Código de prueba:

 def test_bring_connection_up(self): # All settings should either overload the update or the run method mock_popen = MagicMock() mock_popen.return_value = {'communicate': (lambda: 'hello','world')} with patch('subprocess.Popen', mock_popen): self.assertEqual(network_manager.bring_connection_up("test"), "Error: Unknown connection: test.\n") 

Código del módulo:

 from subprocess import Popen, PIPE # ........ def list_connections(): process = Popen(["nmcli", "-t", "-fields", "NAME,TYPE", "con", "list"], stdout=PIPE, stderr=PIPE) stdout, stderr = process.communicate() # <--- Here's the failure return stdout 

No estás parcheando en el lugar correcto. Usted Popen donde se define Popen :

 with patch('subprocess.Popen', mock_popen): 

Popen aplicar un parche donde se importa Popen , es decir, en el “Código del módulo” donde escribió esta línea:

 from subprocess import Popen, PIPE 

Es decir, debería verse algo como:

 with patch('myapp.mymodule.Popen', mock_popen): 

Para una guía rápida, lea la sección en los documentos: Dónde parchear .