2011-08-09 21 views
5

He estado usando ScalaTest's FeatureSpec por un par de días y estoy tratando de entender si es posible definir la siguiente especificación utilizando los mezcladores incorporados (y si no, cómo puedo escribir un marcador adecuado) .¿Cómo usar HavePropertyMatcher para elementos de colección en ScalaTest?

Supongamos que tengo el libro de clase:

case class Book(val title: String, val author: String) 

y en mi prueba de que tengo una lista de libros:

val books = List(Book("Moby Dick", "Melville")) 

Ahora, me gustaría precisar que la lista de los libros debe contener una libro con el título "Moby Dick". Me gustaría escribir algo como:

books should contain (value with title "Moby Dick") 

Me parece que no puede averiguar a partir de la documentación y el código si es posible expresar este requisito en ScalaTest. ¿Alguien ha encontrado una situación similar?

Respuesta

2

Actualmente no, aunque podrá hacer algo como esto muy pronto en el futuro. Lo que puede hacer ahora es algo así como:

books.exists(_.title == "Moby Dick") should be (true) 
+0

¡No puedo esperar para esta característica! Realmente espero que maneje casos como: 'los libros deben contener solo (_.title must startWith (" Moby "), _.author no debe ser (" Melville "))' – Steiny

2

Mientras tanto aquí una costumbre matcher puede utilizar:

def containElement[T](right: Matcher[T]) = new Matcher[Seq[T]] { 
    def apply(left: Seq[T]) = { 
    val matchResults = left map right 
    MatchResult(
     matchResults.find(_.matches) != None, 
     matchResults.map(_.failureMessage).mkString(" and "), 
     matchResults.map(_.negatedFailureMessage).mkString(" and ") 
    ) 
    } 
} 

continuación, puede utilizar toda la potencia de la Have matcher ScalaTest para inspeccionar los campos de su objeto:

val books = List(Book("Moby Dick", "Melville"), 
       Book("Billy Budd", "Melville"), 
       Book("War and Peace", "Tolstoy")) 

books should containElement(have('title("Moby Dick"))) 
books should containElement(have('title("Billy Budd"), 'author("Melville"))) 
books should containElement(have('title("War and Peace"), 'author("Melville"))) 

El último es un fallo de la producción de esta salida:

La propiedad del título tenía valor "Moby Dick", en lugar de su valor esperado "Guerra y paz", en el libro de objetos (Moby Dick, Melville) y La propiedad del título tenía valor "Billy Budd", en lugar de su valor esperado "Guerra y Paz", en el objeto del libro (Billy Budd, Melville) y el autor propiedad tenía valor "Tolstoi", lugar de su valor esperado "Melville", el objeto del libro (Guerra y Paz, de Tolstoi)

También puede combinar emparejamientos con and o or, use not, etc.

Cuestiones relacionadas