Burlándose de una llamada de subproceso en Python

Tengo un método ( run_script ) que me gustaría probar. Específicamente quiero probar que ocurre una llamada a subprocess.Popen . Sería incluso mejor probar que subprocess.Popen se llama con ciertos parámetros. Cuando ejecuto la prueba, sin embargo, obtengo TypeError: 'tuple' object is not callable .

¿Cómo puedo probar mi método para asegurarme de que en realidad se llama al subproceso con simulacros?

 @mock.patch('subprocess.Popen') def run_script(file_path): process = subprocess.Popen(['myscript', -M, file_path], stdout=subprocess.PIPE) output,err = process.communicate() return process.returncode def test_run_script(self, mock_subproc_popen): mock_subproc_popen.return_value = mock.Mock(communicate=('ouput','error'), returncode=0) am.account_manager("path") self.assertTrue(mock_subproc_popen.called) 

Me parece inusual que uses el decorador de parches sobre la función run_script , ya que no pasas un argumento simulado allí.

Qué tal esto:

 def run_script(file_path): process = subprocess.Popen(['myscript', -M, file_path], stdout=subprocess.PIPE) output,err = process.communicate() return process.returncode @mock.patch('subprocess.Popen') def test_run_script(self, mock_subproc_popen): process_mock = mock.Mock() attrs = {'communicate.return_value': ('output', 'error')} process_mock.configure_mock(**attrs) mock_subproc_popen.return_value = process_mock am.account_manager("path") # this calls run_script somewhere, is that right? self.assertTrue(mock_subproc_popen.called) 

En este momento, su subproceso simulado.Popen parece devolver una tupla, lo que hace que process.communicate () genere un error TypeError: 'tuple' object is not callable. . Por lo tanto, es más importante obtener el valor de retorno en mock_subproc_popen a la perfección.