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

pytest @patch无法Mock整个父类,但可Mock单个方法的问题求助

问题分析与解决方案

核心原因

子类TestClassChild在child.py被导入的阶段,就已经从父类TestClassParent继承了test_method的直接引用,这个引用指向的是原父类的方法实现。当你patch整个src.scripts.child.TestClassParent类对象时,只是替换了child模块中对父类的名称绑定,但子类已经继承的方法引用不会被更新——子类的方法解析链里保留的是原父类方法的直接引用,而非动态去查找模块中的父类名称。

可行解决方案

方式一:直接Patch子类的目标方法

既然子类已经持有原父类方法的引用,直接针对子类的test_method进行patch即可:

from unittest.mock import patch
from src.scripts.child import TestClassChild

@patch('src.scripts.child.TestClassChild.test_method')
def test_child_mocked_method(mock_test_method):
    mock_test_method.return_value = "mocked output"
    child_instance = TestClassChild()
    result = child_instance.test_method()
    assert result == "mocked output"

方式二:在子类导入前Patch父类

如果需要整体mock父类的所有行为,可以调整导入顺序,在子类定义完成前就完成父类的patch,这样子类会直接继承mock后的父类:

from unittest.mock import patch

# 先patch父类,再导入子类
with patch('src.scripts.child.TestClassParent'):
    from src.scripts.child import TestClassChild
    child_instance = TestClassChild()
    child_instance.test_method()  # 调用的是mock父类的test_method

这种方式需要严格控制导入顺序,适合需要彻底替换父类行为的场景。

补充说明

为什么patch单个父类方法有效?因为你patch的是src.scripts.child.TestClassParent.test_method(父类方法在子类模块中的引用),此时修改的是原父类方法对象的引用,而子类继承的正是这个方法引用,所以调用子类的test_method时会触发mock逻辑。

内容的提问来源于stack exchange,提问作者Code_Worm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:29:53