3

一時的に問題を解決したと思いましたが、まだ問題が残っています。

モデルレイヤーのspecs2テストを作成しようとしています。ダミーオブジェクトを挿入してから、クエリを実行して、データが期待どおりに出力されることを確認します。私の簡単なテストは次のようになります。

クラスModelSpecは仕様を拡張します{

    def is = args(sequential = true)^super.isをオーバーライドします

    オブジェクトFakeAppはFakeApplication()を拡張します

    running(FakeApp){
        println( "データベースのセットアップ")
        val newUser = User(
                    email = "wfbarksdale@gmail.com"、
                    username = "weezybizzle"、
                    password = "nutterbutter")
        User.save(newUser)
    }

    running(FakeApp){
        「ユーザーモデル」は{
            {で「ユーザー名で作成および取得」
                println( "誰かを見つける")
                User.findOneByUsername( "weezybizzle")はSomeである必要があります
            }
            {存在しないユーザーが見つかりません"
                println( "誰も見つからない")
                User.findOneByUsername( "nobody")はNoneである必要があります
            }
        }
    }
}

そして、これが私が単体テストから得たスタックトレースです:

[情報]1つのScalaソースを/www/mojulo3/target/scala-2.9.1/test-classesにコンパイルしています...
データベースを設定する
誰かを見つける
誰も見つけない
[情報]ModelSpec
[情報]
[情報]ユーザーモデルは
[エラー] !ユーザー名で作成および取得
[エラー]IllegalStateException:このMongoは閉じられました(DBTCPConnector.java:123)
[エラー]com.mongodb.DBTCPConnector._checkClosed(DBTCPConnector.java:123)
[エラー]com.mongodb.DBTCPConnector.call(DBTCPConnector.java:207)
[エラー]com.mongodb.DBApiLayer$ MyCollection .__ find(DBApiLayer.java:313)
[エラー]com.mongodb.DBApiLayer$ MyCollection .__ find(DBApiLayer.java:298)
[エラー]com.mongodb.DBCollection.findOne(DBCollection.java:682)
[エラー]com.mongodb.DBCollection.findOne(DBCollection.java:661)
[エラー]com.mongodb.casbah.MongoCollectionBase$ class.findOne(MongoCollection.scala:225)
[エラー]com.mongodb.casbah.MongoCollection.findOne(MongoCollection.scala:897)
[エラー]com.novus.salat.dao.SalatDAO.findOne(SalatDAO.scala:311)
[エラー]models.User$ .findOneByUsername(User.scala:24)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 2 $$ anonfun $ apply $ 3.apply(ModelSpec.scala:29)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 2 $$ anonfun $ apply $ 3.apply(ModelSpec.scala:29)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 2.apply(ModelSpec.scala:29)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 2.apply(ModelSpec.scala:27)
[エラー] !存在しないユーザーが見つかりません
[エラー]IllegalStateException:このMongoは閉じられました(DBTCPConnector.java:123)
[エラー]com.mongodb.DBTCPConnector._checkClosed(DBTCPConnector.java:123)
[エラー]com.mongodb.DBTCPConnector.call(DBTCPConnector.java:207)
[エラー]com.mongodb.DBApiLayer$ MyCollection .__ find(DBApiLayer.java:313)
[エラー]com.mongodb.DBApiLayer$ MyCollection .__ find(DBApiLayer.java:298)
[エラー]com.mongodb.DBCollection.findOne(DBCollection.java:682)
[エラー]com.mongodb.DBCollection.findOne(DBCollection.java:661)
[エラー]com.mongodb.casbah.MongoCollectionBase$ class.findOne(MongoCollection.scala:225)
[エラー]com.mongodb.casbah.MongoCollection.findOne(MongoCollection.scala:897)
[エラー]com.novus.salat.dao.SalatDAO.findOne(SalatDAO.scala:311)
[エラー]models.User$ .findOneByUsername(User.scala:24)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 6 $$ anonfun $ apply $ 7.apply(ModelSpec.scala:35)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 6 $$ anonfun $ apply $ 7.apply(ModelSpec.scala:35)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 6.apply(ModelSpec.scala:35)
[エラー]test.ModelSpec$$ anonfun $ 3 $$ anonfun $ apply $ 1 $$ anonfun $ apply $ 6.apply(ModelSpec.scala:33)
[情報]  
[情報]  
[情報]仕様ModelSpecの合計
[情報]20ミリ秒で終了
[情報]2つの例、0の失敗、2つのエラー
[情報]
[エラー]エラー:合計2、失敗0、エラー2、合格0、スキップ0
[エラー]テスト中のエラー:
[エラー]test.ModelSpec
[エラー]{file:/ www / mojulo3 /} mojulo3 / test:test:テストが失敗しました
[エラー]合計時間:4秒、完了2012年8月28日22:02:33

FakeAppが何らかの理由でデータベースから切断されており、再接続されていないようです。Playソースを調べたところ、実際に同じオブジェクトであるかどうかに関係なく、アプリケーションが停止して再起動するようです。onStop()問題はサラッ法に起因しているのonStart()ではないかと思いますが、よくわかりません。

私はこれにしばらく苦労してきましたが、問題について推論する方法だけでも、どんな助けでも大歓迎です。

4

3 に答える 3

4

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をリリースします。

于 2012-09-07T08:55:27.563 に答える
3

specs2仕様の実行には、2つのフェーズがあります。最初に仕様が作成され、そのすべての例が示されます。その後、実行されます。

代わりにすべきことは次のとおりです。

class ModelSpec extends Specification with AroundExamples {
  // note the use of sequential here which is simpler than
  // overriding the "is" method
  sequential

  object FakeApp extends FakeApplication()

  // this method, defined in the AroundExamples trait
  // makes sure that every example is executed "inside"
  // the fake app.
  def around[R <% Result](r: =>R) = running(FakeApp)(r)

  // this will be only executed after the whole spec is created
  // if anything fails here, an exception will be caught, reported
  // and the rest will not execute
  step { 
    running(FakeApp) {
      println("set up database")
      val newUser = User(
                email = "wfbarksdale@gmail.com",
                username = "weezybizzle",
                password = "nutterbutter")
      User.save(newUser) 
    }
  }

  "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
      }
    }
  }
}

それがお役に立てば幸いです。

于 2012-08-29T02:39:22.460 に答える
2

これは、プラグインのonStopメソッドでMongoDB接続を閉じるためです。テスト中にこれが発生しないように、プルリクエストを送信しました。

https://github.com/leon/play-salat/pull/27

于 2012-08-30T15:10:39.717 に答える