正如Jornsharpe提到的,
with Popen(...) as process
Popen
实例作为上下文管理器,它调用
__enter__
方法并将其值指定给
process
.
jonsharpe的解决方案使用
return_value
mock
import mock
import subprocess
class MockedPopen:
def __init__(self, args, **kwargs):
self.args = args
self.returncode = 0
def __enter__(self):
return self
def __exit__(self, exc_type, value, traceback):
pass
def communicate(self, input=None, timeout=None):
if self.args[0] == 'ls':
stdout = '\n'.join(['hello.txt', 'world.txt'])
stderr = ''
self.returncode = 0
else:
stdout = ''
stderr = 'unknown command'
self.returncode = 1
return stdout, stderr
@mock.patch('subprocess.Popen', MockedPopen)
def foo():
with subprocess.Popen(['ls']) as proc:
stdout, stderr = proc.communicate()
print(stdout, stderr)
foo()
输出:
hello.txt
world.txt