如何导入类并重写__init__,无需复制代码即可测试原类方法?
解决单元测试中仅重写类__init__方法的问题
你遇到的核心问题是不想复制原类的业务方法,同时避免初始化类时处理复杂依赖。这里有几种简洁的解决方案:
方法1:直接调用未绑定的实例方法
实例方法本质上是类的函数,只要传一个模拟的self对象就能直接调用,完全不需要重写原类:
# test_main.py from main import ClassToTest from unittest import mock # 造一个模拟的self对象 fake_instance = mock.Mock() # 直接调用原类的method_to_test,把fake_instance作为self传入 result = ClassToTest.method_to_test(fake_instance, 3) assert result == 5 assert fake_instance.x == 3
方法2:继承原类并重写__init__
如果需要保留类的其他特性,可以继承原类,只重写__init__简化初始化:
# test_main.py from main import ClassToTest class TestableClassToTest(ClassToTest): def __init__(self): # 跳过父类复杂的初始化,直接手动设置需要的属性 self.x = 0 # 或者根据测试需求设置初始值 # 实例化子类,直接调用原方法 test_instance = TestableClassToTest() result = test_instance.method_to_test(3) assert result == 5 assert test_instance.x == 3
方法3:用mock替换原类的__init__方法
通过unittest.mock.patch临时替换原类的__init__,避免复杂初始化:
# test_main.py from main import ClassToTest from unittest import mock # 临时替换ClassToTest的__init__为无操作方法 with mock.patch.object(ClassToTest, '__init__', return_value=None): instance = ClassToTest() # 手动初始化需要的属性(如果方法依赖的话) instance.x = 0 result = instance.method_to_test(3) assert result == 5 assert instance.x == 3
这三种方法都不需要复制原类的method_to_test代码,确保原方法修改后测试代码自动同步,符合单元测试的初衷。
内容的提问来源于stack exchange,提问作者Omega
相关产品推荐
相关产品推荐

