Используя HavePropertyMatcher для элементов коллекции в ScalaTest? - PullRequest
5 голосов
/ 09 августа 2011

Я использую FeatureSpec ScalaTest уже пару дней, и я пытаюсь понять, возможно ли определить следующую спецификацию с помощью встроенных сопоставителей (и если нет, то как я могу написать подходящий настраиваемый сопоставитель)).

Предположим, у меня есть класс Book:

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.Кто-нибудь сталкивался с подобной ситуацией?

Ответы [ 2 ]

3 голосов
/ 19 марта 2013

В то же время вот пользовательский сопоставитель, который вы можете использовать:

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

Последняя ошибка - это вывод:

Свойство title имеет значение «Moby Dick» вместо ожидаемого значения «Война и мир» в объекте Book (Moby Dick)., Melville) и свойство title имеет значение «Billy Budd» вместо ожидаемого значения «Война и мир» для объекта Book (Billy Budd, Melville), а свойство Author имеет значение «Tolstoy» вместо ожидаемого значения ».Мелвилл ", на объекте Книга (Война и Мир, Толстой)

Вы также можете комбинировать спички с and или or, использовать not и т. Д.

2 голосов
/ 09 августа 2011

Не в настоящее время, хотя вы сможете сделать что-то подобное очень скоро в будущем.То, что вы можете сделать сейчас, это что-то вроде:

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