2012-09-28 5 views
7

Sto scrivendo un'app Web utilizzando Play 2, Salat (per bongo mongoDB). Vorrei testare alcuni metodi, nel modello di lezione (ad esempio testare il fatto che recupero la lezione giusta da id). Il problema è che non voglio inquinare il mio DB attuale con lezioni fittizie. Come posso utilizzare un DB falso usando Salat e Scala Test? Ecco uno dei miei file di test. Crea due lezioni e la inserisce nel DB, eseguendone alcuni test.Come testare metodi basati su Salat con 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()))) 
    } 
    } 

} 

Ho cercato sul Web ma non riesco a trovare un buon collegamento o progetto che utilizzi Salat e ScalaTest.

risposta

1

Nelle mie applicazioni, utilizzo un parametro in application.conf per specificare il nome del database Mongo. Durante l'inizializzazione di FakeApplication, sovrascrivo quel parametro in modo che i miei test di unità possano utilizzare una vera istanza di Mongo ma non vedano nessuno dei miei dati di produzione.

sorvolare alcuni dettagli specifici per la mia domanda, i miei test simile a questa:

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

Grazie per la vostra risposta, ha aiutato molto! Solo una cosa, per cancellare tutti i dati esistenti, è possibile utilizzare questo metodo: db.dropDatabase – TeaBough

2

Salat sviluppatore qui. La mia raccomandazione sarebbe di avere un database di test separato. Puoi popolarlo con i dati di test per mettere il tuo database di test in uno stato conosciuto - vedi i test di casbah per come farlo - e poi testarlo contro come preferisci, eliminando le collezioni secondo necessità.

Io uso specs2, non scalatest, ma il principio è lo stesso - vedere il codice sorgente per i test di Salat.

Ecco un buon test per iniziare: https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

Nota che nella mia spec di base a cancellare il mio database di test - questo viene eseguito prima di ogni spec:

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

E poi nel SalatDAOSpec , Eseguo i test all'interno di ambiti che creano, popolano e/o eliminano singole raccolte in modo che i test possano essere eseguiti in uno stato previsto. Un problema: se esegui i test contemporaneamente nella stessa raccolta, potrebbero non riuscire a causa di uno stato imprevisto. La soluzione consiste nell'eseguire i test in raccolte di finalità speciali isolate o nell'esecuzione forzata dei test in serie, in modo che le operazioni su una singola raccolta non si sovrappongano a vicenda poiché i diversi casi di test modificano la raccolta.

Se pubblichi la mailing list di Scalatest (http://groups.google.com/group/scalatest-users), sono sicuro che qualcuno può consigliare il modo corretto di configurarlo.