我有一个嵌套的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 is 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()
当属性失败时,整数被除以2,因为列表被截断(但根据生成器定义,列表应该总是大小为3!)
我正在使用Scala 2.12.1,scalatest 3.0.1 abd scalacheck 1.13.4。
谢谢!
答案 0 :(得分:1)
原来这种机制被称为"收缩"并且可以通过将这些含义添加到范围中来禁用:
def noShrink[T] = Shrink[T](_ => Stream.empty)
implicit val intListNoShrink = noShrink[List[Int]]
implicit val intNoShrink = noShrink[Int]