如何验证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
相关产品推荐
相关产品推荐

