我刚刚开始使用 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
因为我无法将 size 参数传递给它们,所以我的测试没有利用那里的缩小。例如缩小Frob option
toNone
或选择更简单的startTime
. 在生成这样的单个值时,有没有办法传播该大小参数?- 也感谢您指出任何严重的初学者错误,我真的只是想弄清楚如何使用这个 API。