Specs2: Как превратить Seq [Matcher [A]] в одного Matcher [A]? - PullRequest
4 голосов
/ 27 октября 2011

С учетом последовательности Seq[Matcher[A]] Я хочу получить один Matcher[A], который будет успешным, когда все совпадения внутри последовательности завершатся успешно.

Редактировать

Ответ, предоставленный мной, кажется немного неуклюжим, и, кроме того, было бы неплохо, если бы все неудачные сопоставители последовательности дали результат

Ответы [ 2 ]

1 голос
/ 15 февраля 2013

Проблема с созданием нового сопоставителя из последовательности сопоставлений состоит в том, что становится труднее найти сбой сопоставителя.

Лучший вариант, на мой взгляд, состоит в том, чтобы сравнивать с каждым сопоставителем в отдельности, например:

val matchers: Seq[Matcher[Boolean]] = Seq(
  ((_: Boolean).equals(false), "was true 1"),
  ((_: Boolean).equals(true), "was false 2"),
  ((_: Boolean).equals(true), "was false 3")
)

"work with matcher sequence" in {
  matchers.foreach(beMatching => false must beMatching)
}

Из выходных данных видно, что сопоставления вызываются отдельно, и первый сбой вызывает сбой теста с сообщением этого сопоставителя .

В зависимости от имеющегося у вас случая, может быть даже лучше сгенерировать Ожидания для каждого сопоставителя, поэтому он выполнит их все и покажет вам правильный обзор, а не только первый сбой. Я не зашел так далеко (пока).

1 голос
/ 27 октября 2011

Хорошо, я нашел способ:

(matchers: Seq[Matcher[A]]).reduce(_ and _)

Каким-то образом я подумал, что должен быть другой путь, например, писать _.sequence.

...