我们有一个 Flask 应用程序,其中大部分基本 Flask 设置代码都位于应用程序根目录下的文件
run.py
中。所以基本上很多这样的:
app = Flask(__name__)
app.debug = True
app.config(...)
app.config(...)
api = Api(app)
api.add_resource(resources.Registration, '/registration')
api.add_resource(...)
api.add_resource(...)
我正在尝试为其添加单元测试,但我们目前还没有。我大致以 Flask 教程项目(https://github.com/pallets/flask/tree/1.0.2/examples/tutorial)为例。
基本上,您将整个应用程序创建为可以导入的模块 - 并且该模块是一个工厂。因此
__init__.py
有一个 create_app
函数来创建您的应用程序 (https://github.com/pallets/flask/blob/1.0.2/examples/tutorial/flaskr/init.py)。我认为在正常操作期间主应用程序导入模块时会自动调用它,但也可以在conftest.py中显式调用它(https://github.com/pallets/flask/blob/1.0.2/示例/教程/测试/conftest.py)我认为(?)作为pytest
启动的一部分自动调用。
所以我的问题实际上非常简单:有没有一种合适的方法可以启动一些
pytest
测试,而无需将主应用程序的代码重构为工厂模块?我不想太多地接触主应用程序...我想将其保留为一个非常简单的设置,就像我在这个问题顶部的代码一样。
换句话说,这是删除数据库内容后教程中的基本应用程序设置
conftest.py
:
@pytest.fixture
def app():
app = create_app({
'TESTING': True,
'DATABASE': db_path,
})
yield app
我想要一个没有
app
的 create_app
。但由于我们所有的应用程序代码都在我们的基本 run.py
中,除了复制所有内容并保持同步之外,我想不出什么好方法来做到这一点。我无法从 app
导入 run.py
,因为它不是我认为不存在的模块。
抱歉,这太基础了 - 测试和导入声明都不是我的强项。
我想我找到了一种方法...只需这样做,以便您可以包含父文件夹中的模块(按照从父文件夹导入模块),然后导入运行并从中获取变量:
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
import run
@pytest.fixture
def app():
app = run.app
yield app
...当然,我需要找到一种方法来调整那里的行为以进行测试(即相当于教程的通过
'Testing': True
),所以这是我的下一个挑战。
尝试像这样导入您的应用程序:
from app import app as flask_app
@fixture(scope='module')
def app():
flask_app.config.update({
"TESTING": True,
})
yield flask_app
它对我有用!