使用 Flask 进行 pytest:无需 create_app() 即可轻松引入应用程序设置?

问题描述 投票:0回答:2

我们有一个 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
,因为它不是我认为不存在的模块。

抱歉,这太基础了 - 测试和导入声明都不是我的强项。

python flask pytest
2个回答
3
投票

我想我找到了一种方法...只需这样做,以便您可以包含父文件夹中的模块(按照从父文件夹导入模块),然后导入运行并从中获取变量:

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
),所以这是我的下一个挑战。


0
投票

尝试像这样导入您的应用程序:

from app import app as flask_app

@fixture(scope='module')
def app():
    flask_app.config.update({
        "TESTING": True,
    })
    yield flask_app

它对我有用!

© www.soinside.com 2019 - 2024. All rights reserved.