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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:15:04