gpt4 book ai didi

mongodb - 仍然无法针对使用 Salat/Casbah 的 play FakeApp 运行多个测试

转载 作者:可可西里 更新时间:2023-11-01 09:20:31 27 4
gpt4 key购买 nike

我以为我已经修复了 the problem暂时,但事实证明我仍然有问题。

我正在尝试为我的模型层创建一些 specs2 测试,我想插入一些虚拟对象,然后运行一些查询以确保数据按预期输出。这是我的简单测试的样子:

class ModelSpec extends Specification {    override def is = args(sequential = true) ^ super.is    object FakeApp extends FakeApplication()    running(FakeApp){        println("set up database")        val newUser = User(                    email = "wfbarksdale@gmail.com",                    username = "weezybizzle",                    password = "nutterbutter")        User.save(newUser)    }    running(FakeApp) {        "User Model" should {            "be created and retrieved by username" in {                println("finding someone")                User.findOneByUsername("weezybizzle") must beSome            }            "not find non existant user" in {                println("finding nobody")                User.findOneByUsername("nobody") must beNone            }        }    }}

这是我从单元测试中获得的堆栈跟踪:

[info] Compiling 1 Scala source to /www/mojulo3/target/scala-2.9.1/test-classes...set up databasefinding someonefinding nobody[info] ModelSpec[info] [info] User Model should[error] ! be created and retrieved by username[error]     IllegalStateException: this Mongo has been closed (DBTCPConnector.java:123)[error] com.mongodb.DBTCPConnector._checkClosed(DBTCPConnector.java:123)[error] com.mongodb.DBTCPConnector.call(DBTCPConnector.java:207)[error] com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:313)[error] com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:298)[error] com.mongodb.DBCollection.findOne(DBCollection.java:682)[error] com.mongodb.DBCollection.findOne(DBCollection.java:661)[error] com.mongodb.casbah.MongoCollectionBase$class.findOne(MongoCollection.scala:225)[error] com.mongodb.casbah.MongoCollection.findOne(MongoCollection.scala:897)[error] com.novus.salat.dao.SalatDAO.findOne(SalatDAO.scala:311)[error] models.User$.findOneByUsername(User.scala:24)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$3.apply(ModelSpec.scala:29)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$3.apply(ModelSpec.scala:29)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$2.apply(ModelSpec.scala:29)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$2.apply(ModelSpec.scala:27)[error] ! not find non existant user[error]     IllegalStateException: this Mongo has been closed (DBTCPConnector.java:123)[error] com.mongodb.DBTCPConnector._checkClosed(DBTCPConnector.java:123)[error] com.mongodb.DBTCPConnector.call(DBTCPConnector.java:207)[error] com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:313)[error] com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:298)[error] com.mongodb.DBCollection.findOne(DBCollection.java:682)[error] com.mongodb.DBCollection.findOne(DBCollection.java:661)[error] com.mongodb.casbah.MongoCollectionBase$class.findOne(MongoCollection.scala:225)[error] com.mongodb.casbah.MongoCollection.findOne(MongoCollection.scala:897)[error] com.novus.salat.dao.SalatDAO.findOne(SalatDAO.scala:311)[error] models.User$.findOneByUsername(User.scala:24)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$6$$anonfun$apply$7.apply(ModelSpec.scala:35)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$6$$anonfun$apply$7.apply(ModelSpec.scala:35)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$6.apply(ModelSpec.scala:35)[error] test.ModelSpec$$anonfun$3$$anonfun$apply$1$$anonfun$apply$6.apply(ModelSpec.scala:33)[info]  [info]  [info] Total for specification ModelSpec[info] Finished in 20 ms[info] 2 examples, 0 failure, 2 errors[info] [error] Error: Total 2, Failed 0, Errors 2, Passed 0, Skipped 0[error] Error during tests:[error]     test.ModelSpec[error] {file:/www/mojulo3/}mojulo3/test:test: Tests unsuccessful[error] Total time: 4 s, completed Aug 28, 2012 10:02:33 PM

看起来 FakeApp 以某种方式与数据库断开连接,并且没有重新连接。我查看了 Play 源,似乎应用程序将停止并重新启动,无论它是否实际上是同一个对象。我认为问题可能源于 salat onStop() 方法或 onStart() 但我不太确定。

我已经为此苦苦挣扎了一段时间,非常感谢任何帮助,即使只是关于如何推理问题的帮助。

最佳答案

我已经更改了 play-salat 关闭连接的方式的实现。

通常当应用程序停止时关闭所有连接是件好事,因为当应用程序再次启动时插件将被重新实例化。

问题是我在一个惰性 val 中创建了 mongodb 连接,它创建了一次连接,当应用程序停止时,它只是调用 .close() 就可以了。

我所做的修复是,连接现在已关闭,如果您再次请求连接,它会创建一个新连接并将其传递给您。

这在 1.1-SNAPSHOT 版本的 play-salat 中都可用,您可以通过添加立即使用

resolvers += "OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"

此版本还包括 salat 1.9.1 和对上限集合和 gridfs 的支持:)

尝试一下,如果有什么不正常,请告诉我。

如果一切顺利,我会尽快发布最终的 1.1。

关于mongodb - 仍然无法针对使用 Salat/Casbah 的 play FakeApp 运行多个测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com