我试图在 ScalaCheck 中生成可选参数,但没有成功。
似乎没有直接的机制。Gen.containerOf[Option, Thing](thingGenerator)
失败,因为它找不到隐含的Buildable[Thing, Option]
.
我试过了
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
但这不起作用,因为listOfN
生成的列表总是长度为 N。结果我总是得到一个Some[Thing]
. 同样,listOf1
不起作用,因为(a)它不会产生空列表,而且(b)它效率低下,因为我无法设置元素数量的最大限制。
如何生成Option[Thing]
包含无的内容?
编辑:我找到了一个解决方案,但它并不简洁。还有比这更好的方法吗?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
编辑 2:我将此概括为
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
所以我不必多写一次。但肯定这已经在图书馆里了,我只是错过了吗?