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

如何验证unittest.Mock被调用时包含指定参数与任意未知参数?

如何验证unittest.Mock被调用时包含指定参数与任意未知参数?

哈哈,这个需求太常见啦!其实你完全不用手动去遍历mock_calls,unittest.mock库本身就给咱们准备了简洁的解决方案,帮你轻松匹配“指定参数+任意未知参数”的调用场景。

最直接的方案:用ANY匹配任意参数

你只需要导入unittest.mock.ANY,把它放在你不关心的参数位置上就行。它可以匹配任何类型、任何值的参数,完美解决你代码里的随机数匹配问题。

修改你的测试代码如下:

import random
from unittest import mock
from unittest.mock import ANY  # 别忘了导入这个关键工具!

def mymethod(a, handler):
    handler(a, random.random())

def test_mymethod():
    handler = mock.Mock()
    mymethod(5, handler)

    # 用ANY替代你不关心的第二个参数
    handler.assert_any_call(5, ANY)

这样一来,只要handler被调用时第一个参数是5,不管第二个参数是啥随机数,这个断言都会通过,完全符合你的需求。

更灵活的进阶玩法(可选)

如果你的场景更复杂,比如需要匹配参数的某个特征(比如是整数、大于100这类条件),还可以自定义匹配器,或者直接检查call_args_list:

# 比如验证第一个参数是5,第二个参数是浮点数
assert any(call[0][0] == 5 and isinstance(call[0][1], float) for call in handler.call_args_list)

不过这种写法就不如用ANY简洁了,只推荐在特殊场景下使用。

为啥不用手动遍历mock_calls?

手动遍历虽然可行,但代码会变得繁琐,而且mock库自带的断言方法(比如assert_any_call)在断言失败时会自动输出详细的调用记录,帮你快速定位问题,比自己写遍历逻辑友好多啦~

备注:内容来源于stack exchange,提问作者502E532E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:48:08