如果我在测试期间推送两个应用程序上下文,是否会发生任何不良事

时间:2016-03-16 22:37:09

标签: python mongodb flask pytest fixtures

我使用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)

1 个答案:

答案 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来设置上下文。 (虽然我假设你正在进行一些数据库设置/清理。)