Mongodb 测试期间,MongoEngine连接到错误的数据库 上下文

Mongodb 测试期间,MongoEngine连接到错误的数据库 上下文,mongodb,flask,pytest,mongoengine,flask-mongoengine,Mongodb,Flask,Pytest,Mongoengine,Flask Mongoengine,我正在通过扩展创建连接到mongodb的Flask应用程序。我使用说明中指定的应用程序工厂模式创建我的应用程序 问题 在运行测试时,我指定了名为datazilla\u test的测试数据库,该数据库通过mongo.init\u app(app)传递给mongo实例。即使我的app.config['MONGODB']和mongo.app.config['MONGODB']实例具有正确的值(datazilla\u test),该值也不会反映在mongo实例中。因此,当我运行断言assert mong

我正在通过扩展创建连接到
mongodb
Flask
应用程序。我使用说明中指定的
应用程序工厂模式创建我的应用程序

问题 在运行测试时,我指定了名为
datazilla\u test
的测试数据库,该数据库通过
mongo.init\u app(app)
传递给
mongo
实例。即使我的
app.config['MONGODB']
mongo.app.config['MONGODB']
实例具有正确的值(
datazilla\u test
),该值也不会反映在
mongo
实例中。因此,当我运行断言
assert mongo.get_db().name==mongo.app.config['MONGODB_db']
时,会触发此错误
AssertionError:assert'datazzilla'=='datazzilla_test'

问题 我做错了什么?为什么数据库连接使用默认数据库
datazzilla
而不是
datazilla_test
?如何修复它

源代码
初始化
从flask_mongoengine进口mongoengine
mongo=MongoEngine()
def create_应用程序(配置=无):
app=烧瓶(名称)
app.config['MONGODB_HOST']='localhost'
app.config['MONGODB_PORT']='27017'
app.config['MONGODB_DB']='datazzilla'
#覆盖默认配置
如果config不是None:
app.config.from_映射(config)
mongo.init_应用程序(应用程序)
返回应用程序
#conftest.py
导入pytest
从应用程序导入mongo
从应用程序导入创建应用程序
@pytest.fixture
def app():
app=创建应用程序({
“MONGODB_DB”:“datazzilla_测试”,
})
断言mongo.get_db().name==mongo.app.config['MONGODB_db']
#断言错误:断言“datazzilla”==“datazzilla_测试”
返回应用程序

Mongoengine在调用fixture时已连接,当您从fixture调用
app=create\u app
时,它尝试重新建立连接,但以静默方式失败(因为它看到已建立现有的默认连接)

这在mongoengine的开发版本中进行了修改(请参阅),但尚未发布(截至2019年6月4日)。当该版本发布后,您可以通过调用
disconnect\u all

同时,您可以: -检查现有连接的创建位置并阻止它 -尝试使用以下方法断开现有连接:

from mongoengine.connection import disconnect, _connection_settings

@pytest.fixture
def app():
    disconnect()
    del _connection_settings['default']
    app = create_app(...)
    ...
但它可能还有其他副作用

巧合的是,我找到了解决这个问题的方法@巴格拉德的回答是正确的!它适用于
MongoClient
,其中客户端的连接设置为
True
——这是/应该是默认值

MongoClient(host=['mongo:27017'], document_class=dict, tz_aware=False, connect=False, read_preference=Primary())
如果是这种情况,那么您必须断开数据库并删除连接设置,正如@bagerard解释的那样

解决方案 但是,如果将
MongoClient
连接更改为
False
,则不必断开数据库连接并删除连接设置。最终对我有效的解决方案是这个解决方案

def create_应用程序(config=None):
...
app.config['MONGODB_CONNECT']=False
...
笔记 正如我之前写的。我碰巧找到了这个解决方案,我正试图解决这个问题。事实证明,它解决了这两个问题:)


如果有任何副作用,我现在还不知道!如果你发现了一些,请在评论部分分享

听起来,在调用fixture之前,您的全局
mongo
实例已经连接到“datazzilla”数据库。在
create\u app
调用之前,您能否调用
mongo.get\u db()
,并告诉我结果(如果没有建立其他连接,则会引发MongoEngineConnectionError)。我按照您的建议做了。调用
mongo.get_db()
before
create_app
results的结果,数据库连接指向
datazzilla
db。谢谢,它成功了!到目前为止,我还没有体验到任何副作用。因此,我投票表决这个问题:)我期待着看到mongoengine发行版>0.17.0并测试
断开所有的连接。另外,我的mongoclient会抛出此警告
mongoclient在fork之前打开。仅在分叉之后创建MongoClient。
您是否意识到这种行为并知道如何修复它?P.S.2我找到了
用户的解决方案警告:MongoClient在分叉之前打开。
我必须将mongo客户端上的connect属性从
true
(默认)更改为
false
。e、 g
MongoClient(connect=False)
这听起来像是在建立了Mongoengine连接之后,您正在分叉进程