我刚刚开始使用FsCheck。我需要生成一些测试数据,这里TestData
表示我测试的输入:
type Interval = { Start : DateTime; End : DateTime }
type Frob = { Interval : Interval; MustFrob : bool }
type TestData = { Intervals: Interval[]; Frob : Frob option }
我的代代码如下:
let generator = gen {
let! startTime = Arb.Default.DateTime().Generator
return! Gen.sized(fun size -> gen {
let intervalDurations = Gen.listOfLength size myOwnSuperDurationGenerator
let intervals =
// blabla using startTime and intervalDurations
let! maybeFrob = Arb.Default.Option<Frob>().Generator
let adjustedFrob = maybeFrob |> Option.map(fun f ->
{ f with Interval = // mess with the interval }
return { Intervals = intervals; Frob = adjustedFrob }
}
}
所以,这很有效,但是我不喜欢调用Arb.Default.Blabla().Generator
,因为我无法传递它们的大小参数,所以我的测试没有利用那里的缩小。例如,将Frob option
缩小为None
,或选择更简单的startTime
。有没有办法在生成像这样的单个值时传播该大小参数? - 还要感谢指出任何令人发指的初学者错误,我真的只想弄清楚如何使用这个API。