繁体   English   中英

如何在 QuickCheck 中使用自定义 listOf

[英]How to use custom listOf in QuickCheck

在我的代码中,我需要生成一个Point列表

我在Arbitrary类型类中实例化了自定义类型Point 到现在为止还挺好。

现在我需要生成一个列表: [Points]

但是listOf生成的默认随机列表(使用listOf我相信?)对我不起作用。 因为我需要points之间的一些特殊关系。 我知道 Generator 组合器,例如。 suchAs但是他们太慢了(因为非常罕见的关系)

我已经定义了一个定制的Gen [Point]来满足我的需求。

randomBoard :: Gen [Point]
randomBoard = ...

但我不知道如何让我的测试在属性测试中使用这个自定义Gen ,因为它默认为listOf生成的列表。

IIUC,问题是您的测试使用Arbitrary实例,通过Testable 实例 for (Arbitrary a, Show a, Testable prop) => Testable (a -> prop)

获取自定义生成器的常见模式是使用所需的Arbitrary实例抛出一些newtype 所以你会定义类似的东西

newtype Board = Board [Point]

instance Arbitrary Board where
  ...

那行得通。 但我建议完全绕过Arbitrary并使用forAll 及其变体编写您的属性。

genBoard :: Gen [Point]
genBoard = ...

shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...

myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM