python - pytest 模拟函数但验证参数

标签 python pytest pytest-mock

我有一个带有外部 API 调用的方法。

外部 API 调用采用两个参数(XML 字符串和数字),如果成功,则会在外部系统中创建一些内容。

def create_stuff(my_number: int,name: str):
    try:
        new_value = my_number + 5
        stuff_xml = '''<?xml version='1.0' encoding='UTF-8'?>
        <description>''' + name + '''</description>
        <properties/>'''
        external_api_call.create_stuff(name, new_value)
        return {"status": 'success', "message": "created stuff '" + name}
    except Exception as e:
        return {"status": 'failure', "message": "error while creating stuff: " + str(e)}

因为我无法从 pytest 环境访问外部系统,并且真的不想在那里创建仅用于测试目的的东西,所以我决定模拟外部调用。

def test_create_stuff(mocker):
    mocker.patch(
        'path.to.class.external_api_call.create_stuff',
        return_value=5
    )

    assert actual['status'] == 'success'

在函数中,外部调用处理参数的验证(即 XML 结构是否有效),但如果我模拟外部调用,我无法验证函数的其余部分是否按设计工作。

有没有办法获取外部调用的参数并验证它们?

例如这样:

def test_create_folder_success(credentials_valid,status_succeded, jenkins_extension_mocked):
    my_mocker = mocker.patch(
        'path.to.class.external_api_call.create_stuff',
        return_value=5
    )
    actual  = my_class.create_stuff(my_number=5,name="foo")
    xml = xml.etree.ElementTree.parse(my_mocker.name) 
    value = my_mocker.new_value
    assert actual['status'] == 'success'
    assert value == 10
    assert validate_xml(xml) == True

最佳答案

谢谢乔恩·夏普,很抱歉回复晚了! 在你的帮助下,我能够让它工作:

def test_create_folder_success(credentials_valid,status_succeded):
    with mock.patch('path.to.class.external_api_call.create_stuff')  as my_mocker:
        actual  = my_class.create_stuff(my_number=5,name="foo")
        my_args = my_mocker.call_args
        xml = xml.etree.ElementTree.parse(my_args[1])
        assert validate_xml(xml) == True
        value = my_mocker.new_value
        assert actual['status'] == 'success'
        assert value == 10

关于python - pytest 模拟函数但验证参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70181469/

相关文章:

python - 可以使用 Dict 而不是列表来应用 Bisect 吗?

Python:将数据输出到 Excel 电子表格

python 3.7 : check if type annotation is "subclass" of generic

python - Py.test 找不到 csv 文件

python-3.x - 如何模拟引发 urllib 错误

python - 如何在Python中控制进程环境变量?

python - 我可以使用基于 fixture 参数 ID 的 pytest.mark.skipif 吗?

python - 是否可以让 pytest 在每次测试执行后调用 webhook?

Python单元测试: Mock an external library function called from a class object

python-3.x - 如何模拟第三方静态方法