如何在Flask单元测试中加载环境变量



我正在尝试测试一个依赖于多个环境变量(主要是API键(的应用程序。我想把它们作为变量,而不是直接放在配置文件中,但我的单元测试(使用unittest(不会运行,因为测试装载时没有加载环境变量。

我试过在setUp中调用load_dotenv(见下文(,但这并没有什么区别。如何确保测试套件正确读取环境变量?

.flaskenv

FLASK_APP=myapp.py
BASE_URI='https://example.com'
OTHER_API_KEY='abc123itsasecret'

config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SQLALCHEMY_DATABASE_URI = "sqlite:///"
API_URL = os.environ.get('BASE_URI') + "/api/v1"
SECRET_KEY = os.environ.get('OTHER_API_KEY')

测试文件.py

import os
from dotenv import load_dotenv
import config
basedir = os.path.abspath(os.path.dirname(__file__))
class TestTheThing(unittest.TestCase):
def setUp(self):
load_dotenv(os.path.join(basedir, '.flaskenv'))
app.config.from_object(config.Config)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://"
db.create_all()
self.client = app.test_client()

运行python -m unittest myapp.test_file后在控制台中

File "/../../package/config.py", line 29, in Config
'API_URL': os.environ.get('BASE_URI') + 'api/v1/',
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

阅读更多内容后,我意识到我需要在配置文件中加载变量,而不是在测试运行程序中加载。将load_dotenv添加到配置文件的顶部可以运行测试。

config.py

import os
from dotenv import load_dotenv
basedir = os.path.abspath(os.path.dirname(__file__))
load_dotenv(os.path.join(basedir, '.flaskenv'))
# rest of file

我花了一些时间试图弄清楚车祸发生在哪里。我在setUp中添加了一个从未命中的断点,所以它必须在执行的早期。

仔细阅读堆栈跟踪,它是由在测试文件顶部导入app引起的。导入应用程序时,它会尝试在调用setUp内部的load_dotenv之前拉入所有变量。在将配置对象加载到Flask对象之前加载环境变量会将其清除。

最新更新