2

有什么方法可以使用 ScalaTest 的 forEvery 检查器,而无需在每次测试失败时打印整个集合?我试图运行测试的集合非常大(超过一千个元素),我对在测试日志中查看它的内容并不感兴趣,特别是如果违规的文本行已经打印在收集的错误中消息。使用该集合进行六次测试也无济于事。

4

2 回答 2

1

只需使用forAll而不是forEvery.

来自文档

  • forAll- 如果断言对每个元素都成立,则成功
  • forEvery- 与 forAll 相同,但如果失败则列出所有失败元素(而forAll仅报告第一个失败元素)
于 2014-10-05T09:03:12.360 回答
1

所以,我找到的解决方案真的很丑陋和骇人听闻。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 的最简单方法(需要使用我自己的类的迭代器)。我很乐意找到任何比这更好的解决方案。

于 2014-10-06T12:01:05.217 回答