如何解决Python单元测试mock未导入类方法时的AttributeError报错
问题原因
你遇到的报错是因为 mock.patch 只能替换目标模块中实际存在的属性:你的被测脚本 func_to_test_script.py 只导入了 ClassA,没有导入过 ClassB,所以 func_to_test_script 模块下根本不存在 ClassB 这个属性,自然会抛出属性不存在的错误。
同时你也完全不需要单独 patch ClassB:被测代码里的 ClassB 实例是通过 ClassA.method_a() 动态返回的,只要控制 method_a 的返回值就能实现对 method_b 的mock,不需要修改无关的模块属性。
解决方案
删掉原本 @mock.patch("func_to_test_script.ClassB", ClassBMock) 这行代码,直接在 ClassA 的mock逻辑中配置 method_a 的返回值即可,以下是两种常用实现方式:
方式1:使用MagicMock快速构造模拟实例
from unittest import mock from func_to_test_script import func_to_test @mock.patch("func_to_test_script.ClassA") def test_func_to_test(self, mock_class_a): # 构造模拟的ClassB实例,预先定义method_b的返回值 mock_instance_b = mock.MagicMock() mock_instance_b.method_b.return_value = "你需要的测试返回值" # 让ClassA.method_a返回这个模拟实例 mock_class_a.method_a.return_value = mock_instance_b # 执行被测函数 func_to_test() # 可选:验证调用逻辑符合预期 mock_class_a.method_a.assert_called_once() mock_instance_b.method_b.assert_called_once()
方式2:使用自定义的ClassBMock
如果你已经预先定义了完整的 ClassBMock 实现,直接将其实例赋值给 method_a 的返回值即可:
from unittest import mock from func_to_test_script import func_to_test # 你预先定义的ClassB模拟实现 class ClassBMock: def method_b(self): return "自定义的测试返回值" @mock.patch("func_to_test_script.ClassA") def test_func_to_test(self, mock_class_a): mock_class_a.method_a.return_value = ClassBMock() # 后续测试逻辑 func_to_test()
内容的提问来源于stack exchange,提问作者Henrique Andrade
相关产品推荐
相关产品推荐

