gpt4 book ai didi

Scalacheck 嵌套 forall 在 Scalatest 测试失败时抛出 "oneOf called on empty collection"

转载 作者:行者123 更新时间:2023-12-04 17:54:09 25 4
gpt4 key购买 nike

我有一个嵌套的 forAll 调用,它取决于前一个调用生成的值。根据其生成器的定义,此值是一个不应为空的集合:

"test" in {
val listGen: Gen[List[Int]] = Gen.listOfN(3, Gen.choose(0, 100))
def intGen(list: List[Int]) = Gen.oneOf(list)
implicit val arbList = Arbitrary(listGen)

forAll { list: List[Int] =>
forAll(intGen(list)) { int =>
true should be(false)
}
}
}

这不会产生诸如“true was not false”之类的错误消息,而是:

IllegalArgumentException was thrown during property evaluation.
Message: oneOf called on empty collection
Occurred when passed generated values (
arg0 = List() // 2 shrinks
)

我想不通为什么。这不是我期望(或理解)的测试失败消息...

如果我打印出生成的列表和整数,我会得到以下奇怪的输出:

List(72, 77, 8)
8
4
2
1
0
List(72)
72
36
18
9
4
2
1
0
List()

当列表被截断时,整数在属性失败时除以二(但根据生成器定义,列表的大小应始终为 3!)

我正在使用 Scala 2.12.1,scalatest 3.0.1 abd scalacheck 1.13.4。

谢谢!

最佳答案

原来这种机制称为“收缩”,可以通过将这些隐式添加到作用域中来禁用:

  def noShrink[T] = Shrink[T](_ => Stream.empty)
implicit val intListNoShrink = noShrink[List[Int]]
implicit val intNoShrink = noShrink[Int]

此链接帮助很大:https://github.com/scalatest/scalatest/issues/584

关于Scalacheck 嵌套 forall 在 Scalatest 测试失败时抛出 "oneOf called on empty collection",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com