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

使用pytest mocker fixture的assert_has_calls时断言失败,求排查

解决pytest mocker中assert_has_calls引发的AssertionError问题

嗨,这个问题其实是对assert_has_calls的用法理解出了小偏差!

你看,assert_has_calls本身不是一个返回布尔值的函数,它是mock库自带的断言方法:当调用序列符合预期时,它会安静地通过;一旦不符合,直接抛出AssertionError。而你现在把它放在assert语句里,相当于在断言None(因为这个方法没有返回值),这自然会触发assert None的失败啦。

把代码改成这样就正常了:

import os
from mock import call

def test_assert_(mocker):
    mocker.patch('os.remove')
    file_list = [f'file_{i}.txt' for i in range(20)]
    for f in file_list:
        os.remove(f)
    calls = [call(f) for f in file_list]
    # 直接调用assert_has_calls,不需要用assert包裹
    os.remove.assert_has_calls(calls, any_order=True)

至于你手动用集合对比的方法能通过,是因为你直接断言两个集合的差异长度为0——这是一个有效的布尔判断,和assert_has_calls的内部逻辑类似,但写法上是正确的断言形式。

顺便提一句,mock库的这类断言方法(比如assert_called_once、assert_called_with)都是直接调用即可,不需要额外用assert包裹,它们内部已经实现了完整的断言逻辑,不符合条件时会主动抛出异常,pytest会自动捕获并标记测试失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:32