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
相关产品推荐
相关产品推荐

