我使用Flask,Mongo(使用Flask-PyMongo)和py.test。我的应用程序有一个py.test fixture,正如你所期望的那样:
@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
' s __init__.py
类似于:
from flask import Flask
from flask.ext.pymongo import PyMongo
app = Flask(__name__)
# ... set config ...
mongo = PyMongo(app)
答案 0 :(得分:1)
它不应该影响任何东西,但它没有必要。使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
灯具没有做任何其他事情,您可以将其删除。直接导入扩展对象并使测试依赖于app
fixture来设置上下文。 (虽然我假设你正在进行一些数据库设置/清理。)