Unit testing 对ScalaTest中的集合元素使用HavePropertyMatcher?
我已经使用ScalaTest的FeatureSpec好几天了,我正在尝试了解是否可以使用内置匹配器定义以下规范(如果不可以,我如何编写合适的自定义匹配器) 假设我有课本: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
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 ")
)
}
}
然后,您可以使用ScalaTestHave
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”)