如何断言接收异常作为参数的被调用函数?
问题原因
你碰到的这个坑,本质是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
相关产品推荐
相关产品推荐

