Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 对ScalaTest中的集合元素使用HavePropertyMatcher?_Unit Testing_Scala_Scalatest - Fatal编程技术网

Unit testing 对ScalaTest中的集合元素使用HavePropertyMatcher?

Unit testing 对ScalaTest中的集合元素使用HavePropertyMatcher?,unit-testing,scala,scalatest,Unit Testing,Scala,Scalatest,我已经使用ScalaTest的FeatureSpec好几天了,我正在尝试了解是否可以使用内置匹配器定义以下规范(如果不可以,我如何编写合适的自定义匹配器) 假设我有课本: case class Book(val title: String, val author: String) 在我的测试中,我有一个书单: val books = List(Book("Moby Dick", "Melville")) 现在,我想指定图书列表应该包含一本标题为“白鲸”的书。我想写一些类似于: books s

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

假设我有课本:

case class Book(val title: String, val author: String)
在我的测试中,我有一个书单:

val books = List(Book("Moby Dick", "Melville"))
现在,我想指定图书列表应该包含一本标题为“白鲸”的书。我想写一些类似于:

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

我似乎无法从文档和代码中看出是否可以在ScalaTest中表达此需求。有人遇到过类似的情况吗?

目前没有,不过你很快就能做类似的事情。您现在可以做的是:

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

同时,您可以使用以下自定义匹配器:

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
matcher的全部功能来检查对象的字段:

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")))
最后一个是产生此输出的故障:

在目标书(Moby Dick,Melville)上,标题财产的价值为“Moby Dick”,而不是其预期价值“战争与和平”;在目标书(Billy Budd,Melville)上,标题财产的价值为“Billy Budd”,而不是其预期价值“Melville”;作者财产的价值为“Tolstoy”,而不是其预期价值“Melville”,关于实物书(战争与和平,托尔斯泰)


您还可以将匹配器与
组合,使用
而不是
,等等。

我等不及要使用此功能了!我真的希望它能处理这样的情况:
书籍应该只包含(标题必须从(“Moby”)开始,作者不能是(“Melville”)