2012-09-28 16 views
7

Estoy escribiendo una aplicación web usando Play 2, Salat (para binding mongoDB). Me gustaría probar algunos métodos, en el Modelo de la lección (por ejemplo, probar el hecho de que recupero la lección correcta por ID). El problema es que no quiero contaminar mi DB actual con lecciones ficticias. ¿Cómo puedo usar un DB falso usando Salat y Scala Test? Aquí hay uno de mis archivos de prueba. Crea dos lecciones, las inserta en el DB y ejecuta algunas pruebas en él.Cómo probar métodos basados ​​en 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()))) 
    } 
    } 

} 

He buscado en la web pero no puedo encontrar un buen enlace o proyecto que utilice Salat y ScalaTest.

Respuesta

1

En mis aplicaciones, utilizo un parámetro en application.conf para especificar el nombre de la base de datos de Mongo. Al inicializar mi FakeApplication, anulo ese parámetro para que las pruebas de mi unidad puedan usar una instancia real de Mongo pero no vea ninguno de mis datos de producción.

pasando por alto algunos detalles específicos a mi solicitud, mis pruebas de ser algo como esto:

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

Gracias por su respuesta, ¡ayudó mucho! Solo una cosa, para borrar cualquier información existente, puede usar este método: db.dropDatabase – TeaBough

2

Salat desarrollador aquí. Mi recomendación sería tener una base de datos de prueba separada. Puede rellenarlo con datos de prueba para poner su base de datos de prueba en un estado conocido (consulte las pruebas de casbah para saber cómo hacer esto) y luego realice una prueba en contra de usted como desee, eliminando las colecciones según sea necesario.

Uso specs2, no scalatest, pero el principio es el mismo: vea el código fuente de las pruebas Salat.

He aquí una buena prueba para empezar: https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/dao/SalatDAOSpec.scala

Nótese que en mi especificación de base borro mi base de datos de prueba - esto se ejecuta antes de cada especialización:

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

Y luego, en SalatDAOSpec , Ejecuto mis pruebas dentro de ámbitos que crean, completan y/o borran colecciones individuales para que las pruebas se puedan ejecutar en un estado esperado. Un enganche: si ejecuta sus pruebas al mismo tiempo en la misma colección, pueden fallar debido a un estado inesperado. La solución es ejecutar sus pruebas en colecciones aisladas de propósitos especiales o forzar sus pruebas para que se ejecuten en serie, de modo que las operaciones en una sola colección no se sucedan ya que diferentes casos de prueba modifican la colección.

Si publica en la lista de correo de Scalatest (http://groups.google.com/group/scalatest-users), estoy seguro de que alguien puede recomendar la forma correcta de configurarlo.

Cuestiones relacionadas