我以为我已经修复了 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 database finding someone finding 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/