unittest.mock断言仅校验指定关键字参数忽略其余参数的正确写法
正确实现方案
方案1:直接读取call_args.kwargs校验(推荐,最直观无额外依赖)
你不需要调用assert_called_with,直接从mock对象的调用参数里取出关键字参数字典校验即可,代码如下:
# 可选:先校验方法确实被调用过 assert mock_foo.bar.called # 校验目标参数存在且值符合预期 assert "important_arg" in mock_foo.bar.call_args.kwargs assert mock_foo.bar.call_args.kwargs["important_arg"] == "hello"
这种写法逻辑清晰,不需要记忆任何特殊API,也不会出现你遇到的类型错误。
方案2:使用ANY搭配完整关键字参数(仅适合知道所有关键字参数key的场景)
如果你明确知道调用时会传入的所有关键字参数的key,只是不关心其他参数的值,可以把其他参数的值都指定为ANY,此时可以用assert_called_with:
from unittest.mock import ANY mock_foo.bar.assert_called_with(important_arg="hello", unimportant_arg=ANY)
你之前的写法错误原因是:**运算符要求后面跟一个映射类型,而ANY是单个参数的匹配对象,不支持直接解包,所以触发了类型错误。
常见问题解答
是否必须手动读取
call_args完成校验?
如果不知道调用时会传入的其他关键字参数的key,是的,读取call_args.kwargs是标准库支持的最简便的实现方式,不需要引入任何第三方依赖,性能和可读性都更好。
内容的提问来源于stack exchange,提问作者Haterind
相关产品推荐
相关产品推荐

