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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:45:09