unit-testing - 将 HavePropertyMatcher 用于 ScalaTest 中的集合元素?

标签 unit-testing scala scalatest

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

假设我有 Book 类:

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

在我的测试中,我有一个书籍 list :
val books = List(Book("Moby Dick", "Melville"))

现在,我想指定书籍列表应包含标题为“Moby Dick”的书籍。我想写一些类似的东西:
books should contain (value with title "Moby Dick")  

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

最佳答案

同时,这里有一个您可以使用的自定义匹配器:

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

然后你可以使用 ScalaTest 的全部功能 Have匹配器来检查对象的字段:
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")))

最后一个是产生此输出的失败:

The title property had value "Moby Dick", instead of its expected value "War and Peace", on object Book(Moby Dick,Melville) and The title property had value "Billy Budd", instead of its expected value "War and Peace", on object Book(Billy Budd,Melville) and The author property had value "Tolstoy", instead of its expected value "Melville", on object Book(War and Peace,Tolstoy)



您还可以将匹配器与 and 结合使用或 or , 使用 not , 等等。

关于unit-testing - 将 HavePropertyMatcher 用于 ScalaTest 中的集合元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6997939/

相关文章:

C++/Visual Studio - 如何输出到测试输出窗口?

scala - scala中的匹配类型

scala - 如何在不具体化的情况下使用源队列并将其返回给调用者?

scala - 如何使用 Spray-json 让 "asJson"方法成为案例类的一部分?

scala - 无法使用 Gradle 运行 Scalatest

unit-testing - 寻找网站自动化测试的途径

java - 为什么调用 fail() 在使用 JUnit 的 Java 类中编译

java - 测试该方法被调用

scala - 我们是否需要测试因异常而失败的公共(public)方法的失败场景?

未找到 scalacheck/scalatest : how to add it in sbt/scala?