小编Mat*_*nan的帖子

mocking subprocess.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在两个模块中,但我只是无法得到它来模拟.

python unit-testing subprocess mocking popen

4
推荐指数
1
解决办法
2722
查看次数

标签 统计

mocking ×1

popen ×1

python ×1

subprocess ×1

unit-testing ×1