我想测试系统在更改初始环境变量时的行为。
the_file.py:
import os
from fastapi import APIRouter
PREFIX = os.getenv("SERVICE_PREFIX") or "/default"
router = APIRouter(prefix=PREFIX)
测试.py:
# Following test is using pytest-mock library for mocker fixture
import os
def test_prefix_value_digested_correctly(mocker):
mocker.patch.dict(
os.environ,
{
"SERVICE_PREFIX": "/services",
},
clear=True,
)
del sys.modules['tip_subscription_db']
from the_file import router
assert router.prefix == "/services"
上述测试失败,因为在初始导入时读取了环境变量:
assert router.prefix == "/services"
E AssertionError: assert '/default' == '/services'
E - /services
E + /default
我可以通过创建一个函数
get_prefix
来解决这个问题,该函数可以随时随地读取环境,但这不是这里的目标。目标是健全性检查 - “如果我设置 SERVICE_PREFIX 环境变量,则 router.prefix 应该更改”。
有没有办法动态地将这样的环境变量发送到python unittests/pytest?
使用函数来确定
PREFIX
,尽量不要测试“全局状态”:
import unittest
import os
from unittest import mock
def get_prefix():
return os.getenv("SERVICE_PREFIX") or "/default"
class TestMyApi(unittest.TestCase):
@mock.patch.dict(os.environ, {'SERVICE_PREFIX': '/FOO'})
def test_get_prefix_from_os(self):
self.assertEqual(get_prefix(), "/FOO")
@mock.patch.dict(os.environ, {})
def test_get_prefix_default(self):
self.assertEqual(get_prefix(), "/default")
if __name__ == '__main__':
unittest.main()
出:
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK