5

我已经使用 ScalaTest 的 FeatureSpec 几天了,我试图了解是否可以使用内置匹配器定义以下规范(如果没有,我如何编写合适的自定义匹配器)。

假设我有课本:

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

在我的测试中,我有一个书籍清单:

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

现在,我想指定图书列表应包含标题为“Moby Dick”的图书。我想写一些类似的东西:

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

我似乎无法从文档和代码中弄清楚是否可以在 ScalaTest 中表达这个要求。有没有人遇到过类似的情况?

4

2 回答 2

3

与此同时,您可以使用一个自定义匹配器:

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”

您还可以将匹配器与andor or、 usenot等结合使用。

于 2013-03-19T15:53:04.443 回答
2

目前还没有,尽管你很快就能做这样的事情。你现在可以做的是:

books.exists(_.title == "Moby Dick") should be (true)
于 2011-08-09T19:03:58.443 回答