如何在python测试中模拟subprocess.check_call异常

问题描述 投票:0回答:2

我是Python中的模拟新手

我想模拟一个来自 subprocess.check_call 的异常 CalledProcessError,当异常发生时我想检查 ret 值是否为 1。

当我模拟如下函数调用时,我得到错误

def myFunc(cmd):
    try:
        ret = subprocess.check_call(cmd)
    except subprocess.CalledProcessError as e:
        ret = 1

    return ret

def test_some_func():
    with mock.patch('subprocess.check_call', side_effect=subprocess.CalledProcessError("Exception")):
        ret = myFunc(["some_command"])
        assert ret == 1

我得到了错误

with mock.patch('subprocess.check_call', side_effect=subprocess.CalledProcessError("Exception")):
E       TypeError: __init__() missing 1 required positional argument: 'cmd'

任何人都可以给我提示缺少什么吗? 有关于 python 模拟的好的教程/书籍吗?

python mocking pytest
2个回答
0
投票

将参数添加到 CalledProcessError 后丢失。

def test_some_func():
    with mock.patch('subprocess.check_call', 
                     side_effect=subprocess.CalledProcessError('127',
                     'some_command'):
        ret = myFunc(["some_command"])
        assert ret == 1

0
投票

我最近也有同样的需求。我发现模拟 subprocess.call() 更容易,它是由 subprocess.check_call 在内部调用的。

call() 甚至可以为您和所有内容处理获取 cmd 参数!

@patch.object(subprocess, "call", return_value=1)
def test_some_func
   your-code-that-runs-check_call-here
© www.soinside.com 2019 - 2024. All rights reserved.