Python 如果我在测试期间推送两个应用程序上下文,会发生什么不好的事情吗?
我使用的是Flask、Mongo(带Flask-PyMongo)和py.test。我的应用程序有一个py.test夹具,正如您所期望的: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
@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中您正在进行一些数据库设置/清理。)