Python单元测试中如何正确mock被导入的依赖配置模块?
问题错误分析
- patch路径不符合mock规则
unittest.mock的patch遵循「在哪里使用,就patch哪里」的规则。你的func.py模块中已经导入了folder.some_config_module并绑定到了自身命名空间的config变量,函数运行时读取的是folder.func.config,你直接patch源模块folder.some_config_module不会影响func模块中已经导入的config引用。 - 变量命名冲突+未完成替换
你测试代码中导入的test.test_config被命名为test_config,而patch生成的mock对象参数也叫test_config,覆盖了你导入的测试配置,且你没有把导入的测试配置赋值给mock对象,自然无法生效。 - 拼写错误
从func模块导入函数时写成了serach_for_data(缺少字母r),会直接触发导入错误。 - 导入路径不匹配
你给出的项目结构里测试文件夹命名为test,但测试代码里写的是import tests.test_config,多了字母s,会触发模块找不到错误。 - 断言逻辑不匹配
原search_for_data函数没有写返回值,默认返回None,你断言等于0必然失败,需要根据你的实际逻辑调整函数或者断言规则。
正确实现方式
你可以直接用patch的new参数直接替换目标引用,写法更简洁:
# test.py import unittest from unittest.mock import patch # 修正测试模块导入路径 import test.test_config as test_config # 修正函数导入拼写 from folder.func import search_for_data class TestSearchForData(unittest.TestCase): # 直接替换func模块中的config为你的测试配置模块 @patch('folder.func.config', new=test_config) def test_one(self): # 此处断言根据你函数的实际返回逻辑调整,示例假设函数返回config.predefined_parameter self.assertEqual(search_for_data(), test_config.predefined_parameter) if __name__ == "__main__": unittest.main()
如果你只需要替换配置里的单个参数,不需要替换整个模块,也可以这么写:
class TestSearchForData(unittest.TestCase): @patch('folder.func.config') def test_one(self, mock_config): # 只修改指定参数值 mock_config.predefined_parameter = 0 self.assertEqual(search_for_data(), 0)
内容的提问来源于stack exchange,提问作者peak_finding_prob
相关产品推荐
相关产品推荐

