Python单元测试:导入类方法与模块函数Mock失效问题
问题原因及解决方案
核心问题
你的Mock设置存在关键错误,导致Mock值未生效:
importedClass的Mock对象层级错误:你直接给类Mock设置了meth1的返回值,但myMethod中是先实例化importedClass,再调用实例的meth1方法。正确的层级应该是在「类Mock的返回值(即实例Mock)」上设置meth1的返回值。- Patch参数顺序易混淆:
@patch装饰器的参数传递顺序是从下到上,即最靠近测试方法的装饰器对应的Mock参数排在最前面,原有代码的参数顺序虽正确但逻辑不够直观。
修正后的测试代码
import unittest from unittest.mock import patch from my_module import myClass class test_myClass(unittest.TestCase): @patch('my_module.myModule1') @patch('my_module.importedClass') def test_myMethod(self, mock_class, mock_mod1): # 修正:给importedClass的实例Mock设置meth1返回值 mock_class.return_value.meth1.return_value = 2 # myModule1.methodMod1的Mock设置正确,保留 mock_mod1.methodMod1.return_value = {"keyParam3": 5, "keyParam4": 7} test_parameters = (0, 0) test_res = myClass(*test_parameters) self.assertEqual(test_res.param3, 2) self.assertEqual(test_res.param4, 5) if __name__ == '__main__': unittest.main()
关键细节解释
- 类Mock的层级逻辑:当你patch
importedClass时,mock_class是这个类的Mock对象。代码执行newVar = importedClass()时,实际是调用mock_class(),返回的是mock_class.return_value这个Mock实例。因此必须给这个实例的meth1方法设置返回值,才能让newVar.meth1()返回你期望的数值。 - 模块函数的Mock逻辑:patch
my_module.myModule1后,mock_mod1是模块的Mock对象,直接给它的methodMod1属性设置return_value即可,这部分原有代码逻辑正确。 - Patch顺序调整:将
@patch('my_module.myModule1')移到更靠近测试方法的位置,对应的参数mock_mod1排在mock_class之后,更符合装饰器参数传递的直观逻辑,避免后续维护时混淆。
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

