已打补丁类的方法Mock失效问题求助
问题原因及修复方案
核心问题1:Patch的目标路径错误
你当前patch的是my_module.LegacyClass,但ClassToTest实际使用的是它自己模块(class_to_test.py)里导入的LegacyClass引用。根据unittest.mock的规则,必须patch被测试代码实际依赖的那个引用,也就是class_to_test.LegacyClass,而非原模块中的类。
核心问题2:Mock方法的对象搞错了
legacy_mock是LegacyClass这个类的mock对象,当ClassToTest执行LegacyClass()实例化时,返回的是legacy_mock.return_value(这才是模拟的实例对象)。你之前直接给legacy_mock.get_dict赋值,是给类本身设置方法,而self.legacy.get_dict()调用的是实例的方法,自然不会生效。
修正后的测试代码
from unittest import TestCase, patch, MagicMock from class_to_test import ClassToTest @patch('class_to_test.LegacyClass') # 修正patch路径 class TestClass(TestCase): def test_case(self, legacy_mock): # 给模拟的实例对象设置get_dict方法 legacy_mock.return_value.get_dict = MagicMock(return_value={'data': {'value': 1}}) ctt = ClassToTest() assert ctt.method_to_test()
这样修改后,ClassToTest创建的self.legacy就是legacy_mock.return_value这个预设好的mock实例,它的get_dict方法会返回你需要的静态字典,测试就能正常通过。
内容的提问来源于stack exchange,提问作者Stefano Castoldi
相关产品推荐
相关产品推荐

