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

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,提问作者양정훈

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:57:02