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

标签 mongodb playframework-2.0 casbah specs2 salat

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

相关文章:

java - 在 Play 2.0 FakeRequest 中测试 MultipartFormData

java - Play 2.2 中的 block 响应缓慢

scala - 如何在scala/play中将casbah mongodb列表转换为json

scala - java.lang.IllegalArgumentException : BasicBSONList can only work with numeric keys, 不是:[_id]

java - Scala + Casbah 对象映射良好实践

forms - 如何在不同的输入中显示表单的全局错误?

mongodb - Spring MongoDB 聚合 DBRef

node.js - 如何修复 TypeError : Cannot read property 'hash' of undefined during hashing password for GraphQL mutation with bcryptjs?

node.js - MongoDB、Mongoose 和复合 _id

java - Spring Data MongoDB 4.0 事务支持