Python 如果我在测试期间推送两个应用程序上下文,会发生什么不好的事情吗?

Python 如果我在测试期间推送两个应用程序上下文,会发生什么不好的事情吗?,python,mongodb,flask,pytest,fixtures,Python,Mongodb,Flask,Pytest,Fixtures,我使用的是Flask、Mongo(带Flask-PyMongo)和py.test。我的应用程序有一个py.test夹具,正如您所期望的: @pytest.fixture def app(request): from proj import app ctx = app.app_context() ctx.push() request.addfinalizer(lambda: ctx.pop()) return app 我还有一个Mongo装置。现在,m

我使用的是Flask、Mongo(带Flask-PyMongo)和py.test。我的应用程序有一个py.test夹具,正如您所期望的:

@pytest.fixture
def app(request):
    from proj import app

    ctx = app.app_context()
    ctx.push()
    request.addfinalizer(lambda: ctx.pop())

    return app
我还有一个Mongo装置。现在,
mongo
对象是用Flask PyMongo创建的,因此它需要一个应用程序上下文才能工作。我提出了以下建议:

@pytest.fixture
def mongo():
    from proj import app, mongo

    ctx = app.app_context()
    ctx.push()
    request.addfinalizer(lambda: ctx.pop())

    return mongo
这是因为,如果我有这样一个测试,它是有效的:

def test_mongo(mongo):
    assert mongo.db.coll.find({'foo': 'bar'}).count() > 0
但是,在某些情况下,我希望同时访问应用程序和数据库:

def test_app_and_mongo(app, mongo):
    assert serious_stuff(app, mongo)
这将导致创建两个应用程序上下文。就目前而言,它只是起作用,但考虑到我还不太了解烧瓶,我很谨慎

这会导致什么不好的事情发生吗?我会因此看到什么令人惊讶的行为吗


作为参考,
proj
\uuuu init\uuuu.py
类似于:

from flask import Flask
from flask.ext.pymongo import PyMongo

app = Flask(__name__)
# ... set config ... 
mongo = PyMongo(app)

这不应该影响任何事情,但不是必须的。使
mongo
装置依赖于已设置上下文的
app
装置

import pytest
from proj import app as flask_app, mongo as mongo_ext

@pytest.fixture
def app():
    with flask_app.app_context():
        yield flask_app

@pytest.fixture
def mongo(app):
    return mongo_ext

def test_with_app(app):
    ...

def test_with_mongo(mongo):
    ...

def test_with_both(app, mongo):
    ...

由于
mongo
fixture没有执行任何其他操作,因此可以将其删除。直接导入扩展对象,使测试依赖于
app
fixture来设置上下文。(尽管我假设在真实的fixture中您正在进行一些数据库设置/清理。)