F# 如何在复杂情况下利用收缩
我刚刚开始使用FsCheck。我需要生成一些测试数据,这里F# 如何在复杂情况下利用收缩,f#,fscheck,F#,Fscheck,我刚刚开始使用FsCheck。我需要生成一些测试数据,这里TestData表示测试的输入: type Interval = { Start : DateTime; End : DateTime } type Frob = { Interval : Interval; MustFrob : bool } type TestData = { Intervals: Interval[]; Frob : Frob option } 我的生成代码如下所示: let generator = gen {
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 }
}
}
let生成器=gen{
让!startTime=Arb.Default.DateTime().Generator
返回!Gen.size(有趣的大小->Gen{
让intervalDurations=Gen.listOfLength大小myOwnSuperDurationGenerator
让间隔=
//blabla使用开始时间和间隔时间
让!maybeFrob=Arb.Default.Option().Generator
让adjustedFrob=maybeFrob |>Option.map(乐趣f->
{f with Interval=//mess with the Interval}
返回{间隔=间隔;Frob=调整Frob}
}
}
这是可行的,但我不喜欢调用
Arb.Default.Blabla().Generator
,因为我无法向他们传递大小参数,所以我的测试不会利用收缩的优势。例如,将Frob选项
收缩为None
,或者选择一个更简单的开始时间
。在生成这样的单个值时,是否有方法传播该大小参数?-也感谢pointi为了找出任何令人震惊的初学者错误,我真的只是想弄清楚如何使用这个API。我不认为有一种简单的方法可以从复杂的生成器中获得收缩器,但是你可以从现有的收缩器中构建自己的收缩器。这个问题似乎让人想起GitHub上最近的一个问题:如果你能提供一个,我很乐意提出建议gest是具体的代码,但操作代码不能编译。