【发布时间】:2016-07-03 01:51:52
【问题描述】:
我正在使用 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)
这将导致创建两个应用上下文。现在它只是工作,但鉴于我还不太了解 Flask,我很谨慎。
这会导致不好的事情发生吗?因此,我会看到任何令人惊讶的行为吗?
作为参考,proj 的 __init__.py 类似于:
from flask import Flask
from flask.ext.pymongo import PyMongo
app = Flask(__name__)
# ... set config ...
mongo = PyMongo(app)
【问题讨论】:
标签: python mongodb flask pytest fixtures