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()
beforecreate_app
results的结果,数据库连接指向datazzilla
db。谢谢,它成功了!到目前为止,我还没有体验到任何副作用。因此,我投票表决这个问题:)我期待着看到mongoengine发行版>0.17.0并测试断开所有的连接。另外,我的mongoclient会抛出此警告mongoclient在fork之前打开。仅在分叉之后创建MongoClient。
您是否意识到这种行为并知道如何修复它?P.S.2我找到了用户的解决方案警告:MongoClient在分叉之前打开。
我必须将mongo客户端上的connect属性从true
(默认)更改为false
。e、 gMongoClient(connect=False)
这听起来像是在建立了Mongoengine连接之后,您正在分叉进程