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

Python使用patch装饰器Mock类时单元测试断言失败的问题排查

问题分析与修复方案

你当前的测试错误核心是Mock对象的层级没搞对:

  • 用@patch('mymath.MyMath')替换MyMath类后,mymath_mock是这个类的Mock实例
  • 被测函数里my_math = MyMath()创建的实例,本质是mymath_mock.return_value(类Mock的实例化结果)
  • 你之前把my_add的返回值和断言都挂在了类Mock上,但实际调用的是实例的my_add方法,自然会出现调用次数为0、返回值不匹配的错误

修复后的测试代码

不需要修改任何被测代码,直接调整测试逻辑即可:

import unittest
from unittest.mock import patch
import mymath

class TestMyMath(unittest.TestCase):
    @patch('mymath.MyMath')
    def test_add_three_and_two(self, mymath_mock):
        # 给实例的my_add方法设置返回值
        mymath_mock.return_value.my_add.return_value = 5

        result = mymath.add_three_and_two()

        # 断言实例的my_add被正确调用
        mymath_mock.return_value.my_add.assert_called_once_with(3, 2)
        self.assertEqual(5, result)

unittest.main()

关键调整点

  • 将mymath_mock.my_add.return_value改为mymath_mock.return_value.my_add.return_value:指定实例方法的返回值
  • 将mymath_mock.my_add.assert_called_once_with(...)改为mymath_mock.return_value.my_add.assert_called_once_with(...):断言实例方法的调用情况

这样修改后,测试就能正常通过,完全满足你“不修改被测代码”的要求。

内容的提问来源于stack exchange,提问作者Csaba Faragó

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20