2013-06-24 2 views
5

Production에서 사용 된 것과 동일한 데이터베이스 설정을 사용하여 Play 2 Scala 앱에 대한 단위 테스트를 실행하고 싶습니다. 다음은 "java.sql.SQLException : 이미 종료 된 풀에서 연결을 얻으려고 시도합니다."와 함께 실패합니다. 2 차 시험에서.) 난 그냥 BogusTest이Play 2.1 Slick과 Postgres로 단위 테스트

2를 실행하도록 요청에도 불구하고,

1) 모든 테스트를 실행합니다

$ play -Dconfig.file=`pwd`/conf/dev.conf "test-only controllers.BogusTest" 

다른 두 신비 :

package controllers 

import org.specs2.mutable._ 
import play.api.db.DB 
import play.api.Play.current 
import play.api.test._ 
import play.api.test.Helpers._ 
import scala.slick.driver.PostgresDriver.simple._ 

class BogusTest extends Specification { 

    def postgresDatabase(name: String = "default", 
         options: Map[String, String] = Map.empty): Map[String, String] = 
    Map(
     "db.test.driver" -> "org.postgresql.Driver", 
     "db.test.user"  -> "postgres", 
     "db.test.password" -> "blah", 
     "db.test.url"  -> "jdbc:postgresql://localhost/blah" 
    ) 

    def fakeApp[T](block: => T): T = 
    running(FakeApplication(additionalConfiguration = 
     postgresDatabase("test") ++ Map("evolutionplugin" -> "disabled"))) { 
     def database = Database.forDataSource(DB.getDataSource("test")) 
     database.withSession { implicit s: Session => block } 
     } 

    "Fire 1" should { 
    "do something" in fakeApp { 
     success 
    } 
    } 

    "Fire 2" should { 
    "do something else" in fakeApp { 
     success 
    } 
    } 
} 

는이 같은 테스트를 실행 application.conf는 def.conf가 아니라 항상 사용되며 드라이버 정보는 코드에 구성된 정보가 아니라 application.conf에서 제공됩니다.

+0

을 지정하는 방법에 대한 정보는 http://stackoverflow.com/questions/15399161/how-do-i-specify-a-config-file-with-sbt-0-12-2-for-sbt-test를 참조하십시오. 'config '로 다른 설정 파일. –

+0

감사합니다. 신비 2를 처리해야합니다. 주된 문제에 대해서도 밝힐 수 있습니까? –

+0

나는 똑같은 문제를 겪고있다. specs2에서 Around 특성을 사용하지 않고 단순히 in {running (fakeApp) {Database.forDataSource (DB.getDataSource()) withSession {}}} '내에 래핑하면이 예외도 발생합니다. – Meredith

답변

4

이것은 현재 2.2.0 버전에서 테스트를 마쳤으므로 잠정적 인 답변이며 MYSQL 데이터베이스를 사용하여 버그를 재현 할 수 없습니다.

코드에 매우 까다로운 버그가있을 수 있습니다. 당신이 BoneCPPPlugin, 플레이에서 제공하는 DBPlugin 구현 탐구 경우 우선은 :

/** 
    * Closes all data sources. 
    */ 
    override def onStop() { 
    dbApi.datasources.foreach { 
     case (ds, _) => try { 
     dbApi.shutdownPool(ds) 
     } catch { case NonFatal(_) => } 
    } 
    val drivers = DriverManager.getDrivers() 
    while (drivers.hasMoreElements) { 
     val driver = drivers.nextElement 
     DriverManager.deregisterDriver(driver) 
    } 
    } 

을 당신은 이동 중지() 메소드는 연결 풀을 닫을 것을 알 수있다. 따라서 이미 중지 된 응용 프로그램을 두 번째 테스트 예제에 제공하고 있습니다 (따라서 해당 플러그인이 중지되고 db connectin 풀이 닫힙니다).

Scalatests 병렬 테스트를 실행 specs2, 그것은 스레드 안전 때문에 테스트 도우미에 의존 할 수 있습니다 소스 코드에서

DB.getDataSource("test") 

할 때, 그러나

def running[T](fakeApp: FakeApplication)(block: => T): T = { 
     synchronized { 
      try { 
      Play.start(fakeApp) 
      block 
      } finally { 
      Play.stop() 
      play.api.libs.ws.WS.resetClient() 
      } 
     } 
     } 

을 재생 :

여기 암시 적입니다. FakeApplication으로 해결되지 않습니다 (n o 범위 내에서 암시 적으로 !!!)하지만, Play.current으로 바꾸고 두 번째 경우에는 Play.current가 여전히 FakeApplication의 이전 인스턴스를 가리 키도록 기대했던 것이 아닙니다. 암시는 당신이 그러나, fakeApp 방법을 리팩토링 경우

def fakeApp[T](block: => T): T = { 
    val fakeApplication = FakeApplication(additionalConfiguration = 
     postgresDatabase("test") ++ Map("evolutionplugin" -> "disabled")) 
     running(fakeApplication) { 
     def database = Database.forDataSource(DB.getDataSource("test")(fakeApplication)) 
     database.withSession { implicit s: Session => block } 
     } 
    } 
(당신은 항상 암시 적 매개 변수에 대한 명시 적 값을 만들 수 있습니다) 당신이 단지 암시를 해결하는 데 사용됩니다 만든 응용 프로그램을 보장 할 수 있습니다 폐쇄

을에 캡처됩니다

+0

Edmondo, 우수한 sleuthing! 이것은 앞으로 나아갈 것입니다. 불행히도 "RuntimeException : 시작된 응용 프로그램이 없습니다."라는 메시지가 나타납니다. 나는 모든 관련 파일들로 요점을 만들었습니다 https://gist.github.com/mslinn/8046542 –

+0

github repo에 sbt 프로젝트를 제공 할 수 있습니까? test.conf에서 가져온 application.conf가 없으므로 디버깅 할 수 있습니다. 당신의 요지에서 나는 여전히 당신이 play.api.Play.current를 가지고있는 것을 본다. 무슨 일이 일어나는지 확인하기 위해 그것을 제거합니다. – Edmondo1984

+0

여기에서 변경 한 내용으로 다시 시도하십시오 - https://gist.github.com/drstevens/8048116/f181c671c64df210e37197a30a5801e25f6014fc – drstevens