【发布时间】:2019-06-03 15:37:04
【问题描述】:
上下文
我正在创建Flask 应用程序连接到mongodb 使用MongoEngine 通过flask-mongoengine 扩展。我按照configuration 说明中的说明使用application factory pattern 创建我的应用程序。
问题
在运行测试时,我指定了名为datazilla_test 的测试数据库,它通过mongo.init_app(app) 传递给mongo 实例。即使我的app.config['MONGODB_DB'] 和mongo.app.config['MONGODB_DB'] 实例具有正确的值(datazilla_test),该值也不会反映在mongo 实例中。因此,当我运行断言assert mongo.get_db().name == mongo.app.config['MONGODB_DB'] 时,会触发此错误AssertionError: assert 'datazzilla' == 'datazzilla_test'
问题
我做错了什么?为什么数据库连接持续使用默认数据库datazzilla,而不是datazilla_test?如何解决?
源代码
# __init__.py
from flask_mongoengine import MongoEngine
mongo = MongoEngine()
def create_app(config=None):
app = Flask(__name__)
app.config['MONGODB_HOST'] = 'localhost'
app.config['MONGODB_PORT'] = '27017'
app.config['MONGODB_DB'] = 'datazzilla'
# override default config
if config is not None:
app.config.from_mapping(config)
mongo.init_app(app)
return app
# conftest.py
import pytest
from app import mongo
from app import create_app
@pytest.fixture
def app():
app = create_app({
'MONGODB_DB': 'datazzilla_test',
})
assert mongo.get_db().name == mongo.app.config['MONGODB_DB']
# AssertionError: assert 'datazzilla' == 'datazzilla_test'
return app
【问题讨论】:
-
听起来您的全局
mongo实例在您的夹具被调用之前已经连接到“datazzilla”数据库。您能否在create_app调用之前调用mongo.get_db()并让我知道结果(如果没有建立其他连接,它应该引发 MongoEngineConnectionError) -
我按照你的建议做了。在
create_app之前调用mongo.get_db()的结果是db 连接指向datazzilladb。
标签: mongodb flask pytest mongoengine flask-mongoengine