Есть ли способ использовать инспектор ScalaTest forEvery без печати всей коллекции при каждом сбое теста? Коллекция, на которой я пытаюсь запустить тест, довольно велика (более тысячи элементов), и мне не очень интересно видеть ее содержимое в журналах тестирования, особенно если оскорбительная строка текста уже напечатана в собранной ошибке. Сообщения. Наличие шести тестов, использующих эту коллекцию, также не помогает.
ScalaTest — как использовать forEvery без печати всей коллекции?
Ответы (2)
Просто используйте forAll
вместо forEvery
.
Из документов:
forAll
— успешно, если утверждение верно для каждого элементаforEvery
- то же, что и forAll, но перечисляет все неисправные элементы, если он не работает (тогда какforAll
просто сообщает о первом неисправном элементе)
Итак, решение, которое я нашел, действительно уродливое и хакерское. Принцип работы forEvery (и, как я подозреваю, других инспекторов) заключается в том, что они пытаются получить итератор вашей коллекции, если могут, как для запуска тестов, так и для распечатки вашей коллекции. Мое решение передает правильный итератор только при первом запуске, и если инспектор снова пытается захватить итератор (что он делает только для вывода коллекции), он получает Seq.empty.iterator. Лучшее, что можно сказать об этом коде, это то, что он работает:
def forEvery[E](xs: TraversableOnce[E])(fun: E => Unit): Unit = {
class SilentSeq[E](list: TraversableOnce[E]) extends Seq[E] {
var silent: Boolean = false
def length = 0
def apply(i: Int) = list.toIterator.next()
def iterator = {
if (silent)
Seq.empty.iterator
else {
silent = true
list.toIterator
}
}
}
Inspectors.forEvery[E, Seq](new SilentSeq(xs))(fun)
}
Инспектор не использует ни длину, ни применение, поэтому все, что я туда добавляю, не имеет значения, если оно имеет правильный тип. Расширение Seq — это едва ли не самый простой способ, который я нашел, чтобы притвориться GenTraversable (что необходимо для использования итератора моего собственного класса). Я был бы рад найти любое решение, которое лучше, чем это.