单元测试:如何保留__init__定义的属性值,解决MyClass无folder属性报错
问题解决方法
错误根因
MyClass中的a是实例方法,第一个参数self要求接收MyClass的实例对象。你在静态方法b中写的MyClass.a(MyClass)是直接把类本身作为self参数传入,而folder是实例初始化__init__阶段才绑定到实例上的属性,不属于MyClass类本身的属性,因此执行self.folder时会抛出属性不存在的错误。
解决方案(均不需要mock a()方法返回值)
方案1:修正业务代码调用逻辑(推荐,从根源修复问题)
调整静态方法b的内部逻辑,先初始化MyClass实例再调用实例的a方法,修改后的业务代码如下:
import os class MyClass: def __init__(self): self.folder = os.environ.get('folder') def a(self): myFolder = self.folder return myFolder @staticmethod def b(): # 先创建实例再调用实例方法 instance = MyClass() myData = instance.a() return myData
修改后原有测试代码无需任何调整,即可正常运行通过。
方案2:业务代码不可修改时,调整测试逻辑补充类属性
如果暂时不能修改业务代码的错误写法,可以在测试初始化阶段给MyClass类新增对应的folder类属性,适配业务代码的调用逻辑,修改后的测试代码如下:
import unittest from unittest.mock import patch from myclass import MyClass @patch.dict('os.environ', {'folder': 'blabla'}) class TestMyClass(unittest.TestCase): @classmethod def setUpClass(cls): # 给MyClass类补充folder属性,匹配参数要求 MyClass.folder = os.environ.get('folder') def testB(self): myclass = MyClass() content = myclass.b() # 可补充断言验证结果,例如 self.assertEqual(content, 'blabla')
内容的提问来源于stack exchange,提问作者Menryck
相关产品推荐
相关产品推荐

