You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:32:01