Python单元测试使用patch修改导入模块函数不生效问题咨询
Python unittest patch 不生效解决方案
核心问题原因
- patch路径错误:
unittest.mock.patch的核心规则是「patch 实际被调用的位置,而非函数定义的位置」。你的测试目标test_me.py中已经将another_file模块导入为别名another_file_alias,实际调用的是test_me模块作用域下的another_file_alias.func1、another_file_alias.func2,所以你之前patch原定义路径another_file.func1是不会生效的。 - patch生命周期错误:你在
setUp方法中直接用with语句包裹patch,setUp执行结束后with代码块就会退出,patch会自动恢复,执行test_1的时候模拟已经失效。
正确配置方案
方案1:用patch装饰器修饰测试用例(适合单测试用例独立使用mock)
import unittest from unittest.mock import patch import test_me def func1_mock(): # 你的模拟逻辑 ... def func2_mock(): # 你的模拟逻辑 ... class TestClass(unittest.TestCase): # 注意装饰器顺序和参数顺序是反的,先写的patch对应后一个参数 @patch("test_me.another_file_alias.func2", side_effect=func2_mock) @patch("test_me.another_file_alias.func1", side_effect=func1_mock) def test_1(self, mock_func1, mock_func2): # 执行test_me中的业务逻辑,此时mock生效 test_me.你的业务方法() # 可选:验证mock调用情况 mock_func1.assert_called_once() mock_func2.assert_called_once()
方案2:setUp中全局启动patch(适合所有测试用例复用同一mock)
class TestClass(unittest.TestCase): def setUp(self): # 初始化patch实例,路径和方案1一致 self.patcher1 = patch("test_me.another_file_alias.func1", side_effect=func1_mock) self.patcher2 = patch("test_me.another_file_alias.func2", side_effect=func2_mock) # 手动启动patch self.patcher1.start() self.patcher2.start() def tearDown(self): # 测试结束后手动停止patch,避免影响其他测试 self.patcher1.stop() self.patcher2.stop() def test_1(self): # 执行测试逻辑,patch全程生效 test_me.你的业务方法()
补充提醒:
test_me.py中的导入语句写法有误,Python导入模块不需要加.py后缀,正确写法为import another_file as another_file_alias,否则会先出现导入错误。
内容的提问来源于stack exchange,提问作者dashboard
相关产品推荐
相关产品推荐

