Mat*_*nan 4 python unit-testing subprocess mocking popen
当试图模仿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
Run Code Online (Sandbox Code Playgroud)
并遵循单元测试代码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")
Run Code Online (Sandbox Code Playgroud)
由于某些原因,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
Run Code Online (Sandbox Code Playgroud)
然后在测试中返回"输出".
任何人都想了解为什么,我的偏好是从子进程导入Popen,Pipe在两个模块中,但我只是无法得到它来模拟.
您需要在listdir中修补Popen的副本,而不是刚刚导入的那个.所以,而不是@mock.patch.object(subprocess, 'Popen', autospec=True)
尝试@mock.patch.object(listdir, 'Popen', autospec=True)
有关详细信息,请参阅此文档:http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch
归档时间: |
|
查看次数: |
2722 次 |
最近记录: |