如何在单元测试中Mock __init__.py中的环境变量?
解决单元测试中Mock环境变量时机问题
核心原因
你的测试代码里,get_file.py在测试函数执行前就被导入了,而@mock.patch.dict是在测试函数运行时才修改环境变量,导致sharepoint/__init__.py加载时环境变量还没Mock,触发KeyError。
解决方案
方案1:调整导入时机,Mock后再导入模块
把import sharepoint.get_file从测试文件顶部移到测试函数内部,确保环境变量Mock完成后再加载模块:
from unittest import mock import os def test_get_file_methods(): with mock.patch.dict(os.environ, { "FULL_CLIENT": 'full_client', 'SECRET': 'secret', 'SHAREPOINT_URL': 'url', 'FOLDER_PATH': 'path', 'LIMIT_HOURS': 'hours' }): # Mock生效后再导入模块 from sharepoint import get_file # 执行测试逻辑 get_file.your_target_method()
方案2:在测试文件最顶部提前设置环境变量
直接在测试文件开头(任何模块导入之前)设置环境变量,无需使用mock:
import os # 提前设置环境变量,早于所有模块导入 os.environ["FULL_CLIENT"] = 'full_client' os.environ["SECRET"] = 'secret' os.environ["SHAREPOINT_URL"] = 'url' os.environ["FOLDER_PATH"] = 'path' os.environ["LIMIT_HOURS"] = 'hours' # 现在导入测试所需模块 from sharepoint import get_file from unittest import TestCase class TestGetFile(TestCase): def test_target_method(self): # 执行测试逻辑 result = get_file.your_target_method() self.assertEqual(result, expected_value)
方案3:修改业务代码,延迟环境变量获取
如果允许调整业务代码,把环境变量获取改为延迟加载(封装成函数),避免模块导入时直接触发环境变量读取:
在sharepoint/__init__.py中修改:
import os def get_env_vars(): return { "FULL_CLIENT": os.environ["FULL_CLIENT"], "SECRET": os.environ["SECRET"], "SHAREPOINT_URL": os.environ["SHAREPOINT_URL"], "FOLDER_PATH": os.environ["FOLDER_PATH"], "LIMIT_HOURS": os.environ["LIMIT_HOURS"] }
然后在get_file.py中,需要使用时再调用函数获取:
from . import get_env_vars def your_target_method(): env_vars = get_env_vars() sharepoint_url = env_vars["SHAREPOINT_URL"] # 后续业务逻辑
这样测试时,只需要在调用目标方法前Mock环境变量即可,不会在导入阶段触发KeyError。
内容的提问来源于stack exchange,提问作者BAPF123
相关产品推荐
相关产品推荐

