类__init__内创建的对象方法Mock失败,报错AttributeError求解答
问题分析:AttributeError: 'A' object has no attribute '_A__db_obj'
原代码(类A)
import DBClass class A: def __init__: self.__db_obj = DBClass() def func1(): data = self.__db.obj.func2() return data
类A通过__init__创建DBClass的私有实例__db_obj,func1调用该实例的func2方法获取数据。
测试代码
def test_func1: mocker.patch("temp.A.__init__", return_value=None) mocker.patch("temp.DBClass.func2", return_value={'data1': key1}) response = A().func1() assert response == {'data1': key1}通常Re这.restacten提供 sizeOriginal Garden中等以下内容:
运行错误
AttributeError: 'A' object has no attribute '_A__db_obj'
错误原因
- 核心原因:你用
mocker.patch("temp.A.__init__", return_value=None)完全替换了类A的构造方法,导致创建A实例时原__init__根本没有执行,自然不会初始化__db_obj这个私有属性,调用func1时就会找不到该属性。 - 原代码还有两处语法错误(虽非本次报错直接原因,但需修正):
__init__方法缺少参数括号,正确写法是def __init__(self):func1方法缺少self参数,且调用私有属性时名称写错,应为self.__db_obj.func2()而非self.__db.obj.func2()
修正后的测试方案
不需要替换整个__init__,直接mockDBClass或者类A的私有属性即可,两种可行方案:
方案1:Mock DBClass类
def test_func1(mocker): # Mock DBClass类,让它返回带有mock func2的实例 mock_db_cls = mocker.patch("temp.DBClass") mock_db_cls.return_value.func2.return_value = {'data1': 'key1'} # 创建A实例,原__init__正常执行,但DBClass已被mock a = A() response = a.func1() assert response == {'data1': 'key1'}
方案2:直接Mock类A的私有属性
注意Python会对私有属性做名称改写,__db_obj实际在类内部会变成_A__db_obj:
def test_func1(mocker): # 先正常创建A实例 a = A() # Mock私有属性_A__db_obj mock_db_obj = mocker.patch.object(a, '_A__db_obj') mock_db_obj.func2.return_value = {'data1': 'key1'} response = a.func1() assert response == {'data1': 'key1'}
内容的提问来源于stack exchange,提问作者M S Gokul
相关产品推荐
相关产品推荐

