Python unittest中assert_called_with验证多次调用失败问题
解决多次Mock调用的参数验证问题
你遇到的核心问题是:assert_called_with仅会验证mock对象最后一次调用的参数,而非按顺序校验所有调用记录。当你连续两次调用该方法时,第二次验证会覆盖第一次的校验逻辑,导致与实际的两次调用参数/顺序不匹配,最终触发AssertionError。
正确的验证方式
针对多次调用的参数校验,推荐使用以下两种方案:
1. 使用assert_has_calls配合call对象(推荐)
先从unittest.mock导入call,然后通过assert_has_calls按顺序(或不按顺序)验证所有调用的参数:
from unittest.mock import patch, call @patch('your_module.gitlabapi.put_request') def test_set_project_settings(api_mock): # 执行被测试方法 set_project_settings() # 验证两次调用的参数和顺序 api_mock.assert_has_calls([ call('/projects/your-project-id/settings', {'key1': 'value1'}), # 第一次调用的参数 call('/projects/your-project-id/settings', {'key2': 'value2'}) # 第二次调用的参数 ], any_order=False) # 可选:验证调用次数确实为2 api_mock.assert_called_times(2)
any_order=False:强制要求调用顺序与预期列表完全一致;如果两次调用的顺序不影响业务逻辑,可以设为True忽略顺序。
2. 直接检查call_args_list属性
mock对象的call_args_list会按调用顺序存储所有调用的参数,你可以直接通过索引取值并断言:
@patch('your_module.gitlabapi.put_request') def test_set_project_settings(api_mock): set_project_settings() # 校验第一次调用的参数 assert api_mock.call_args_list[0] == call('/projects/your-project-id/settings', {'key1': 'value1'}) # 校验第二次调用的参数 assert api_mock.call_args_list[1] == call('/projects/your-project-id/settings', {'key2': 'value2'})
为什么单次调用时正常?
assert_called_once_with是专门为仅调用一次的场景设计的,它会同时验证调用次数为1,且参数匹配,因此单次调用时可以正常通过;但多次调用时,该方法不再适用。
注意事项
- 确保
call对象中的参数形式与实际调用完全一致:如果实际调用是通过关键字参数传递的(比如put_request(url=xxx, data=yyy)),那么call里也要使用关键字参数(call(url=xxx, data=yyy)),不能混用位置参数。
内容的提问来源于stack exchange,提问作者Shalomi90
相关产品推荐
相关产品推荐

