在我的代码中,我需要生成一个Point
的列表
我在Point
类型类中实例化了自定义类型Arbitrary
。
到目前为止一切顺利。
现在我需要生成一个列表:[Points]
但是QuickQuick(我相信使用listOf
生成的默认随机列表对我不起作用。
因为我需要points
之间的某些特殊关系。我知道发电机组合器,例如。 suchAs
但是它们太慢了(因为关系非常罕见)
我已经定义了一个自定义的Gen [Point]
以适合我的需求。
randomBoard :: Gen [Point]
randomBoard = ...
但是我不知道如何让我的测试在属性测试中使用此自定义Gen
,因为它默认为listOf
生成的列表。
答案 0 :(得分:3)
IIUC,问题是您的测试通过Arbitrary
instance for Testable
使用(Arbitrary a, Show a, Testable prop) => Testable (a -> prop)
实例。
获取自定义生成器的常见模式是使用所需的newtype
实例抛出一些Arbitrary
。所以你要定义类似
newtype Board = Board [Point]
instance Arbitrary Board where
...
那行得通。但我建议您完全绕开Arbitrary
,并用forAll
and its variants编写属性。
genBoard :: Gen [Point]
genBoard = ...
shrinkBoard :: [Point] -> [[Point]]
shrinkBoard = ...
myProperty :: Property
myProperty = forAllShrink genBoard shrinkBoard (\board -> ...)