我有一个带有外部 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/