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ó
相关产品推荐
相关产品推荐

