2012-09-28 1 views
7

저는 Play 2, Salat (mongoDB bindin의 경우)를 사용하여 웹 응용 프로그램을 작성하고 있습니다. Lesson Model에서 몇 가지 메서드를 테스트하고 싶습니다. (예를 들어 id로 올바른 레슨을 검색한다는 사실을 테스트 할 수 있습니다.) 문제는 현재의 DB를 더미 레슨으로 오염시키고 싶지 않다는 것입니다. Salat와 Scala Test를 사용하여 어떻게 가짜 DB를 사용할 수 있습니까? 여기에 내 테스트 파일 중 하나가 있습니다. 그것은 두 개의 수업을 만들고 그것을 DB에 삽입하고 그것에 대해 몇 가지 시험을합니다.ScalaTest로 Salat을 기반으로 메서드를 테스트하는 방법

LessonSpec extends FlatSpec with ShouldMatchers { 
    object FakeApp extends FakeApplication() 

    val newLesson1 = Lesson(
    title = "lesson1", 
    level = 5, 
    explanations = "expl1", 
    questions = Seq.empty) 
    LessonDAO.insert(newLesson1) 

    val newLesson2 = Lesson(
    title = "lesson2", 
    level = 5, 
    explanations = "expl2", 
    questions = Seq.empty) 
    LessonDAO.insert(newLesson2) 

    "Lesson Model" should "be retrieved by level" in { 
    running(FakeApp) { 
     assert(Lesson.findByLevel(5).size === 2) 
    } 
    } 
    it should "be of size 0 if no lesson of the level is found" in { 
    running(FakeApp) { 
     Lesson.findByLevel(4) should be(Nil) 
    } 
    } 

    it should "be retrieved by title" in { 
    running(FakeApp) { 
     Lesson.findOneByTitle("lesson1") should be(Some(Lesson("lesson1", 5, "expl1", List()))) 
    } 
    } 

} 

웹에서 검색했지만 Salat 및 ScalaTest를 사용하는 좋은 링크 또는 프로젝트를 찾을 수 없습니다.

답변

1

내 응용 프로그램에서는 application.conf의 매개 변수를 사용하여 Mongo 데이터베이스 이름을 지정합니다. My FakeApplication을 초기화 할 때, 그 유닛 테스트가 실제 Mongo 인스턴스를 사용할 수 있지만 프로덕션 데이터를 전혀 볼 수 없도록이 매개 변수를 오버라이드합니다. 여기

// wipe any existing data 
db.collectionNames.foreach { colName => 
    if (colName != "system.indexes") db.getCollection(colName).drop 
} 

app = FakeApplication(additionalConfiguration = Map("mongo.db.name" -> "unit-test")) 
+0

답변 해 주셔서 감사합니다. 많은 도움이되었습니다. 한 가지 기존 데이터를 지우려면 다음 방법을 사용하면됩니다. db.dropDatabase – TeaBough

2

Salat 개발자 : 내 응용 프로그램과 관련된 몇 가지 세부 사항을 통해 왜곡에

, 내 테스트는 다음과 같이 보인다. 내 추천은 별도의 테스트 전용 데이터베이스가있을 것입니다. 테스트 데이터를 입력하여 테스트 데이터베이스를 알려진 상태로 만들 수 있습니다 (이를 수행하는 방법은 casbah 테스트를 참조하십시오). 그런 다음 필요에 따라 콜렉션을 지우고 테스트 할 수 있습니다.

scalatest가 아닌 specs2를 사용하지만 원칙은 동일합니다. Salat 테스트의 소스 코드를 참조하십시오.

여기 시작하는 좋은 테스트입니다 : https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

주 내 기본 사양에 내 테스트 데이터베이스를 삭제하는 것이 -이 각 사양 전에 실행됩니다 : SalatDAOSpec에 다음

trait SalatSpec extends Specification with Logging { 

    override def is = 
    Step { 
     //  log.info("beforeSpec: registering BSON conversion helpers") 
     com.mongodb.casbah.commons.conversions.scala.RegisterConversionHelpers() 
     com.mongodb.casbah.commons.conversions.scala.RegisterJodaTimeConversionHelpers() 

    }^
     super.is^
     Step { 
     //  log.info("afterSpec: dropping test MongoDB '%s'".format(SalatSpecDb)) 
     MongoConnection().dropDatabase(SalatSpecDb) 
     } 

그리고 , 테스트를 예상 상태로 실행할 수 있도록 개별 컬렉션을 만들고 채우거나 지우는 범위 내에서 내 테스트를 실행합니다. 한 가지 문제점 : 동일한 콜렉션에서 동시에 테스트를 실행하면 예기치 않은 상태로 인해 테스트가 실패 할 수 있습니다. 해결책은 격리 된 특수 목적의 콜렉션에서 테스트를 실행하거나 테스트를 연속적으로 실행하여 다른 테스트 케이스가 콜렉션을 수정할 때 단일 콜렉션의 작업이 서로 밟지 않도록하는 것입니다.

Scalatest 메일 링리스트 (http://groups.google.com/group/scalatest-users)에 게시하는 경우 누군가가이를 설정하는 올바른 방법을 권장 할 수 있습니다.