带Flask的pytest:无需create_app()即可轻松进入我们的应用设置的简便方法?

时间:2019-05-06 15:00:09

标签: python flask pytest

我们有一个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/examples/tutorial/tests/conftest.py)中显式调用,我认为(?)会被自动调用。 pytest启动。

所以我的问题实际上很简单:是否可以通过一种不错的方式来启动一些pytest测试,而无需将主应用程序的代码重构为工厂模块?我不想过多地触摸主应用程序...我想把它作为一个非常简单的设置(如我的代码放在此问题的顶部)保留。

换句话说,一旦您删除了数据库内容,这就是教程conftest.py中的基本应用设置:

@pytest.fixture
def app():

    app = create_app({
        'TESTING': True,
        'DATABASE': db_path,
    })

    yield app

我希望没有app的{​​{1}}。但是,由于我们所有的应用程序代码都只在基本的create_app中,因此除了复制所有内容并使其保持同步之外,我想不出一种好方法。我无法从run.py导入app,因为它不是我不认为的模块。

很抱歉,这是如此基本-测试和导入声明都不是我的强项。

1 个答案:

答案 0 :(得分:0)

我想我找到了一种方法...只要做到这一点,以便您可以包含父文件夹中的模块(按照Importing modules from parent folder),然后导入run并从中获取变量:

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