如何使用Starlette Config模拟环境变量用于单元测试?
在单元测试中模拟Starlette Config的环境变量值
你可以通过以下几种方式实现单元测试中模拟SOME_ENV_VAR的值:
方法一:临时修改系统环境变量
Starlette的Config会优先读取系统环境变量,你可以在测试阶段临时替换环境变量值,测试完成后恢复:
import os from starlette.config import Config # 项目中的原配置代码 config = Config(".env") SOME_ENV_VAR: str = config("SOME_ENV_VAR", cast=str, default="abc") def test_some_var(): # 保存原环境变量值,用于后续恢复 original_val = os.getenv("SOME_ENV_VAR") # 设置测试用的环境变量 os.environ["SOME_ENV_VAR"] = "xyz" # 重新初始化Config,让它读取新的环境变量 global config, SOME_ENV_VAR config = Config() SOME_ENV_VAR = config("SOME_ENV_VAR", cast=str, default="abc") assert SOME_ENV_VAR == "xyz" # 恢复原环境变量状态 if original_val is None: del os.environ["SOME_ENV_VAR"] else: os.environ["SOME_ENV_VAR"] = original_val
方法二:用pytest的monkeypatch fixture简化操作
如果使用pytest框架,可以借助monkeypatch fixture来更简洁地模拟环境变量,它会自动帮你恢复原状态:
from starlette.config import Config import pytest # 项目中的原配置代码 config = Config(".env") SOME_ENV_VAR: str = config("SOME_ENV_VAR", cast=str, default="abc") def test_some_var(monkeypatch): # 模拟环境变量值 monkeypatch.setenv("SOME_ENV_VAR", "xyz") # 重新初始化Config读取新值 global config, SOME_ENV_VAR config = Config() SOME_ENV_VAR = config("SOME_ENV_VAR", cast=str, default="abc") assert SOME_ENV_VAR == "xyz"
方法三:直接传入模拟配置创建Config实例
Starlette的Config支持直接传入字典作为配置源,完全脱离.env文件和系统环境变量,适合独立测试场景:
from starlette.config import Config def test_some_var(): # 创建带有模拟值的Config实例 mock_config = Config({"SOME_ENV_VAR": "xyz"}) test_var = mock_config("SOME_ENV_VAR", cast=str, default="abc") assert test_var == "xyz"
内容的提问来源于stack exchange,提问作者Cauthon
相关产品推荐
相关产品推荐

