【问题标题】:Using specs2 play! fake application with Reactivemongo causes timeouts使用specs2玩!使用 Reactivemongo 的虚假应用程序导致超时
【发布时间】:2013-09-11 11:10:07
【问题描述】:
我们目前正在解决一个问题,即在 scala 中将 specs2 与 mongodb/reactivemongo + Play! 结合使用。
当我们运行写入 mongodb 的测试时,第一个操作运行良好,所有后续测试/写入都因 mongodb 超时而失败。
我们在反应式 mongo 网站上发现了一个似乎已经记录在案的错误:
https://github.com/ReactiveMongo/Play-ReactiveMongo/issues/32
有人知道这个问题的解决方法吗?
我们已经尝试过了:
- 强制按顺序运行测试
- 每个测试都在自己的假应用中运行
- 在同一个虚假应用程序中运行所有测试
- 将集合定义为 def(如上述问题 32 中所建议的)
非常感谢任何帮助!
【问题讨论】:
标签:
mongodb
scala
playframework-2.1
specs2
reactivemongo
【解决方案1】:
您可以更改(在您的 Controller/Repo/DAO/Service 或您所称的任何名称中):
val db = ReactiveMongoPlugin.db
到
def db = ReactiveMongoPlugin.db
对def
的意义
问题发生是因为调用
play.modules.reactivemongo.ReactiveMongoPlugin#db
返回当前数据库设置,以便将其 val 连接到第一个测试。
FYI 在每次测试之前 Reactive Mongo 插件 建立与 DB 的连接并在每次测试后关闭它。
【解决方案2】:
我在测试期间也有超时,这是我们Global.onStart() 函数的副作用。我们试图确保使用 collection.indexesManager.ensure() 的 Mongo 索引,根据文档,这可能是一个阻塞操作。
由于我们进行了实例化新应用程序和写入/读取数据库的测试,因此该索引会导致大量超时。因此,一种解决方案可能是在您启动应用程序时删除与索引的任何交互。
我知道这篇文章已经很老了,但希望它可以对其他人有所帮助。