有没有办法使用 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/