与此同时,您可以使用一个自定义匹配器:
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 ")
)
}
}
然后,您可以使用 ScalaTestHave
匹配器的全部功能来检查对象的字段:
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")))
最后一个是产生此输出的失败:
在对象 Book(Moby Dick,Melville) 上,title 属性的值为“Moby Dick”,而不是其预期值“War and Peace”,并且 Title 属性的值为“Billy Budd”,而不是其预期值“War and Peace” ",在对象 Book(Billy Budd,Melville) 上,并且在对象 Book(War and Peace,Tolstoy) 上,作者属性的值为“Tolstoy”,而不是其预期值“Melville”
您还可以将匹配器与and
or or
、 usenot
等结合使用。