2012-09-28 11 views
7

Ich schreibe eine Web-App mit Play 2, Salat (für MongoDB Bindin). Ich würde gerne einige Methoden im Lesson Model testen (zB testen, ob ich die richtige Lektion per ID erhalte). Das Problem ist, dass ich meine aktuelle DB nicht mit Dummy-Unterricht verleumden möchte. Wie kann ich eine gefälschte Datenbank mit Salat and Scala Test verwenden? Hier ist eine meiner Testdateien. Es erstellt zwei Lektionen und fügt sie in die Datenbank ein, und es werden einige Tests durchgeführt.So testen Sie Methoden basierend auf Salat mit ScalaTest

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()))) 
    } 
    } 

} 

Ich suchte im Internet, aber ich kann keinen guten Link oder ein Projekt finden, die Salat und ScalaTest verwenden.

Antwort

1

In meinen Anwendungen verwende ich einen Parameter in application.conf, um den Namen der Mongo-Datenbank anzugeben. Bei der Initialisierung meiner FakeApplication überschreibe ich diesen Parameter, damit meine Komponententests eine echte Mongo-Instanz verwenden können, aber keine meiner Produktionsdaten angezeigt werden.

Beschönigung ein paar Details spezifisch für meine Anwendung, schauen meine Tests etwas wie folgt aus:

// 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

Vielen Dank für Ihre Antwort, es hat sehr geholfen! Nur eine Sache, um vorhandene Daten zu löschen, können Sie diese Methode verwenden: db.dropDatabase – TeaBough

2

Salat Entwickler hier. Meine Empfehlung wäre, eine separate Testdatenbank zu haben. Sie können es mit Testdaten bestücken, um Ihre Testdatenbank in einen bekannten Zustand zu versetzen - sehen Sie sich die Casbah-Tests dafür an - und testen Sie dann, wie Sie möchten, indem Sie die Sammlungen nach Bedarf löschen.

Ich verwende Specs2, nicht skaliert, aber das Prinzip ist das gleiche - siehe den Quellcode für die Salat-Tests.

Hier ist ein guter Test für den Einstieg: https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

Beachten Sie, dass meine Testdatenbank in meiner Basis spec mich klar aus - dies vor jedem spec fuehrt wird:

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

Und dann in SalatDAOSpec Ich führe meine Tests in Bereichen durch, die einzelne Sammlungen erstellen, auffüllen und/oder löschen, damit die Tests in einem erwarteten Zustand ausgeführt werden können. Eine Schwierigkeit: Wenn Sie Ihre Tests gleichzeitig in derselben Sammlung ausführen, können sie aufgrund eines unerwarteten Status fehlschlagen. Die Lösung besteht darin, Ihre Tests entweder in isolierten Spezialsammlungen auszuführen oder Ihre Tests in Serie auszuführen, damit sich die Vorgänge in einer einzelnen Sammlung nicht gegenseitig stören, da die Sammlung durch verschiedene Testfälle geändert wird.

Wenn Sie auf der Mailingliste von Scalatest (http://groups.google.com/group/scalatest-users) posten, bin ich mir sicher, dass jemand die korrekte Einrichtung empfehlen kann.