如何用pytest Mock避免Python模块语句触发os.getenv调用?
解决测试中触发
os.getenv()的问题 问题核心是:导入File2时会自动执行File1的代码,进而触发os.getenv(),所以必须在导入File2之前完成mock或环境变量设置,而不是等到导入后再patch方法。以下是几种可行方案:
方案一:导入前mock os.getenv
直接在导入File2前patchos.getenv,让它返回预设的mock值:
from unittest.mock import patch import pytest # 先完成mock,再导入目标模块 with patch('os.getenv') as mock_getenv: mock_getenv.return_value = "mock_config_value" # 替换成你需要的配置值 from File2 import MyClass @patch.object(MyClass, "my_method", return_value=None) def test_my_test(mock1): my_class = MyClass() # 编写你的测试逻辑
也可以用pytest fixture实现模块级别的自动mock:
from unittest.mock import patch import pytest @pytest.fixture(autouse=True, scope='module') def mock_env_vars(): with patch('os.getenv') as mock_getenv: mock_getenv.return_value = "mock_config_value" yield # 此时导入File2不会触发真实的os.getenv from File2 import MyClass @patch.object(MyClass, "my_method", return_value=None) def test_my_test(mock1): my_class = MyClass() # 编写你的测试逻辑
方案二:直接mock File1.SETTINGS
既然File2依赖的是File1的SETTINGS字典,跳过环境变量读取环节,直接mock这个字典:
from unittest.mock import patch import pytest # 导入前mock目标配置 with patch('File1.SETTINGS', {'key1': 'mock_config_value'}): from File2 import MyClass @patch.object(MyClass, "my_method", return_value=None) def test_my_test(mock1): my_class = MyClass() # 编写你的测试逻辑
方案三:用pytest monkeypatch设置环境变量
如果不想用patch,也可以直接通过monkeypatch设置环境变量,让os.getenv()能读到预设值:
import pytest import os @pytest.fixture(autouse=True, scope='module') def set_env_vars(monkeypatch): # 替换成你的环境变量名和对应值 monkeypatch.setenv('YOUR_ENV_VAR_KEY', 'mock_config_value') # 多个变量可重复调用monkeypatch.setenv # 导入时os.getenv会读取到monkeypatch设置的值 from File2 import MyClass from unittest.mock import patch @patch.object(MyClass, "my_method", return_value=None) def test_my_test(mock1): my_class = MyClass() # 编写你的测试逻辑
内容的提问来源于stack exchange,提问作者Mayday
相关产品推荐
相关产品推荐

