2012-08-29 5 views
3

일시적으로 the problem을 수정했다고 생각했지만 여전히 문제가 있습니다.Play에 대해 여러 테스트를 실행할 수 없습니다. Salat/Casbah와 함께 FakeApp

내 모델 레이어에 대한 일부 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 = "[email protected]", 
        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()에서 형태소 분석이 될지도 모른다라고 생각하고있다. 그러나 나는 정말로 확실하지 않다.

저는이 문제로 잠시 동안 고민하고 있습니다. 문제에 대해 판단하는 방법에 대해서만 도움을 주시면 대단히 감사하겠습니다.

답변

2

이것은 플러그인의 onStop 메소드에서 MongoDB 연결을 닫았 기 때문입니다.

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

+0

패치에 대한 질문.이 경우 어떻게 연결이 정리 되나요? – wbarksdale

+0

Mongo가 존재하지 않는 연결을 열어 둘지 의심 스럽기 때문에 테스트 JVM이 종료 될 때 정리해야합니다. (mongod 로그/쉘에서 이것을 확인할 수도 있습니다). – alex

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 = "[email protected]", 
       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 
     } 
    } 
    } 
} 

나는이 도움이되기를 바랍니다.

+0

감사합니다. 스펙 2 문제가 아니라 놀이 또는 연극 관련 문제라고 생각하기 시작했습니다.이것은 스펙에 대해 나에게 뭔가를 가르쳤다. 어쨌든 고마워! – wbarksdale

4

내가 salat 재생 - 그것의 연결을 닫는 방법의 구현을 변경했습니다 :이 테스트 기간 동안 발생하지 않도록 내가 끌어 오기 요청을 제출했습니다.

일반적으로 앱이 다시 시작될 때 플러그인이 다시 인스턴스화되기 때문에 앱이 중지되면 모든 연결을 닫는 것이 좋습니다.

문제는 연결을 한 번 생성 한 lazy val에서 mongodb 연결을 만들고 문제가 발생했습니다. 앱이 멈 추면 간단히 .close()가 호출됩니다.

내가 수정 한 것은 연결이 닫혔으며 연결을 다시 요청하면 새로운 연결을 만들어 전달하는 것입니다. 이것은 당신이

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

이 릴리스는 salat 1.9.1 및 덮인 컬렉션과 gridfs에 대한 지원이 포함되어 추가하여 바로 사용할 수있는 놀이 salat의 1.1-SNAPSHOT 버전에서 모두 사용할 수 있습니다

:)

예상대로 작동하지 않는 경우 나에게 외쳐보십시오.

모든 것이 좋으면 나는 곧 1.1을 발표 할 것입니다.