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

如何正确使用Pytest的assert_called_with?Mock调用断言失败排查

问题解决:正确编写send函数调用断言的测试用例

你的测试代码有两个核心问题,修正后即可正常运行:

错误原因与修正步骤

1. Patch路径不正确,导致Mock未生效

你之前使用@patch('pitest.decorat.send'),但该路径未正确指向do_smth实际调用的send函数,导致原send函数仍被执行(输出了key is a),而Mock对象从未被调用。

修正:如果测试代码和目标函数在同一个文件中,使用__name__ + '.send'作为patch路径,确保替换的是当前模块内的send函数:

@patch(__name__ + '.send')

2. 错误地用assert包裹assert_called_with

assert_called_with是MagicMock自带的断言方法,它会在调用不匹配时直接抛出AssertionError,成功时返回None。用assert包裹它相当于断言None,会直接导致测试失败。

修正:直接调用mo.assert_called_with(key='a'),无需额外的assert。

3. 移除多余的return_value=MagicMock()

Patch默认会自动创建一个MagicMock实例作为被替换函数的替身,额外指定return_value是多余的。

最终正确测试代码

from unittest.mock import patch


def send(key=None):
    print('key is', key)


def do_smth():
    send(key='a')


@patch(__name__ + '.send')
def test_do_smth(mo):
    do_smth()
    mo.assert_called_with(key='a')

验证效果

运行该测试时,原send函数不会输出key is a(因为Mock已经替换了它),如果do_smth确实以key='a'调用了send,测试会通过;如果调用参数不匹配,会抛出明确的断言错误。

内容的提问来源于stack exchange,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:45:29