模拟 subprocess.Popen 取决于导入样式
mocking subprocess.Popen dependant on import style
当尝试模拟 Popen 时,如果子进程的导入在单元测试代码和主模块代码中匹配,我只能让它成功。
给定以下模块 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
和下面的单元测试代码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")
由于某些原因,Popen 未被模拟,因为两个 python 模块之间的导入样式不同,并且 运行 测试总是引发异常。
如果我更改 listdir.py 以导入所有子过程,例如
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
则测试返回"output"
任何人都愿意阐明原因,我的偏好是
from subprocess import Popen, Pipe 在两个模块中,但我无法模拟它。
您需要修补 listdir 中的 Popen 副本,而不是您刚刚导入的那个。因此,尝试 @mock.patch.object(listdir, 'Popen', autospec=True)
而不是 @mock.patch.object(subprocess, 'Popen', autospec=True)
有关详细信息,请参阅此文档:http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch
当尝试模拟 Popen 时,如果子进程的导入在单元测试代码和主模块代码中匹配,我只能让它成功。
给定以下模块 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
和下面的单元测试代码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")
由于某些原因,Popen 未被模拟,因为两个 python 模块之间的导入样式不同,并且 运行 测试总是引发异常。
如果我更改 listdir.py 以导入所有子过程,例如
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
则测试返回"output"
任何人都愿意阐明原因,我的偏好是 from subprocess import Popen, Pipe 在两个模块中,但我无法模拟它。
您需要修补 listdir 中的 Popen 副本,而不是您刚刚导入的那个。因此,尝试 @mock.patch.object(listdir, 'Popen', autospec=True)
@mock.patch.object(subprocess, 'Popen', autospec=True)
有关详细信息,请参阅此文档:http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch