ScalaTest - 如何使用 forEvery 而不打印整个集合?

标签 scala scalatest scala-2.11

有没有办法使用 ScalaTest 的 forEvery 检查器,而不让它在每次测试失败时打印整个集合?我尝试运行测试的集合非常大(超过一千个元素),而且我对在测试日志中查看其内容并不是很感兴趣,特别是如果有问题的文本行已经打印在收集的错误中消息。使用该集合进行六次测试也没有帮助。

最佳答案

所以,我找到的解决方案真的很丑陋而且很黑客。 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 的最简单方法(这是使用我自己的类迭代器所必需的)。我很乐意找到比这更好的解决方案。

关于ScalaTest - 如何使用 forEvery 而不打印整个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26200768/

相关文章:

scala - 从 Scala 宏访问代码文件和行号?

Scala Intellij 断点被忽略

scala - 从 Class[A] 中获取 TypeTag[A]

Scalatest和Spark提供 "java.io.NotSerializableException: org.scalatest.Assertions$AssertionsHelper"

scala - 在 Scala 中对数组进行就地排序

带有类型注释的 for-comprehension 中的 scala 异常

scala 定义了两个选项,首先返回,否则返回第二个

scala - Spock mock Akka 的 ActorRef

scala - ScalaTest 测试用例中,ScalikeJDBC 不会连接到 NamedDB 进行 DSL 查询

scala - PlayFramework Scala 测试 - 通过依赖注入(inject)器获取类的实例