Python unittest mocking类与继承场景下mock失效问题咨询
问题1:替换整个Logging类的mock不生效解决方案
失效原因
mock遵循「在哪里使用就patch哪里」的规则:你当前patch的是logging模块下定义的Logging类,但index.py在模块加载阶段已经将Logging导入到了自身的命名空间,运行index.run()时实际调用的是index模块内已经导入完成的Logging,因此修改原定义路径的mock不会生效。
另外你提供的示例代码还有个小问题:Logging类的debug方法未加@staticmethod/@classmethod装饰器,也没有实例参数self,实例化后调用会触发参数不匹配报错。
修正写法
将patch的目标路径改为index模块下引用的Logging即可:
# 修正后的test2.py import index from logging import Logging class LoggingMock(Logging): # 补充self参数,若不需要实例可以加@staticmethod装饰器 def debug(self, msg): pass # 替换patch目标为index模块下的Logging @patch('index.Logging', LoggingMock) class Test2: def foo(self): index.run()
问题2:父类统一mock子类复用解决方案
失效原因
类装饰器默认不会被子类继承,加在父类上的@patch装饰器仅作用于父类自身的测试方法,不会对其子类的测试方法生效。
解决方法
在父类的测试前置方法中统一启动mock,测试结束后自动停止,子类继承父类后会自动执行前置逻辑,无需重复编写mock代码。以下是unittest框架的示例:
# parent_test.py import index from unittest.mock import patch def debug_mock(msg): pass class ParentTest: def setUp(self): # 启动mock并保存实例 self.logger_patcher = patch('index.Logging.debug', debug_mock) self.logger_patcher.start() def tearDown(self): # 测试结束停止mock,避免污染其他用例 self.logger_patcher.stop()
# test.py class Test(ParentTest): def foo(self): # 运行时mock已自动生效 index.run()
如果使用pytest框架,可以将这段mock逻辑定义为公共fixture,所有测试类直接引用即可实现复用。
内容的提问来源于stack exchange,提问作者양정훈
相关产品推荐
相关产品推荐

