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

如何断言接收异常作为参数的被调用函数?

问题原因

你碰到的这个坑,本质是Python里两个内容相同的异常实例是不同的对象——业务代码里抛出的ValueError,和你测试代码里新建的ValueError('valueError'),虽然错误信息一模一样,但它们在内存里是两个独立的个体,assert_called_with做的是严格的对象比对,自然会断言失败。

解决方法

这里给你两种实用的写法:

方法一:提取调用参数后逐字段校验

先确认函数被调用,再取出传入的异常,检查它的类型和错误消息:

from unittest.mock import patch

@patch('main.myFunc')
def test(mock):
    mainFunc()
    # 先确保函数被调用了一次
    mock.assert_called_once()
    # 获取调用时传入的第一个参数(也就是异常实例)
    called_exception = mock.call_args[0][0]
    # 校验异常类型和错误内容
    assert isinstance(called_exception, ValueError)
    assert str(called_exception) == 'valueError'

方法二:用unittest.mock.ANY配合类型检查

如果想在assert_called_with里直接写,也可以用ANY配合自定义判断:

from unittest.mock import patch, ANY

@patch('main.myFunc')
def test(mock):
    mainFunc()
    # 先断言传入的是任意值,再单独校验参数属性
    mock.assert_called_with(ANY)
    called_exc = mock.call_args[0][0]
    assert isinstance(called_exc, ValueError)
    assert called_exc.args[0] == 'valueError'

或者更紧凑的写法,用lambda表达式配合any()(兼容Python 3.10+):

mock.assert_called_with(
    any(lambda e: isinstance(e, ValueError) and e.args[0] == 'valueError')
)

内容的提问来源于stack exchange,提问作者jereczq22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:23:15