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

如何在单元测试中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:15:35