2011-08-09 19 views
5

Używam funkcji FeatureSpec ScalaTest od kilku dni i staram się zrozumieć, czy możliwe jest zdefiniowanie poniższej specyfikacji za pomocą wbudowanych matchers (a jeśli nie, w jaki sposób mogę napisać odpowiedni niestandardowy matcher) .Używanie HavePropertyMatcher do elementów kolekcji w ScalaTest?

Załóżmy, że mam klasy Book:

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

iw moim testu mam listę książek:

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

Teraz chciałbym, aby określić, że lista książek powinny zawierać książka z tytułem "Moby Dick". Chciałbym napisać coś takiego:

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

I nie może wydawać się dowiedzieć od docs i kodu, jeśli to możliwe, aby wyrazić ten wymóg w ScalaTest. Czy ktoś znalazł się w podobnej sytuacji?

Odpowiedz

2

Obecnie nie, choć w przyszłości będzie można zrobić coś podobnego. Co można teraz zrobić, to coś takiego:

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

Nie mogę się doczekać tej funkcji! Naprawdę mam nadzieję, że obsługuje takie sprawy jak: 'książki powinny zawierać tylko (_.title musi startWith (" Moby "), _.author nie może być (" Melville "))' – Steiny

2

W międzyczasie tu jest niestandardowy układ dopasowujący można użyć:

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

Następnie można użyć pełnej mocy ScalaTest Have dopasowującego do wglądu pola Twojego obiektu:

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

ten ostatni jest porażką produkcji tego wyjścia:

Tytułowa właściwość miała wartość "Moby Dick", zamiast oczekiwanej wartości "Wojna i pokój", na obiekcie Książka (Moby Dick, Melville), a własność tytułu miała wartość "Billy Budd", zamiast wartości oczekiwanej "Wojna i pokój", na obiekcie Księgi (Billy Budd, Melville) i autor nieruchomość miała wartość "Tołstoj", zamiast jej wartości oczekiwanej "Melville", na obiekcie Book (War and Peace, Tołstoja)

Możesz także łączyć dopasowania z and lub or, użyj not, itp.

Powiązane problemy