【发布时间】:2012-10-05 17:06:45
【问题描述】:
是否可以使用 fscheck 生成数据,特别是列表,以便在 fscheck 之外使用?我无法调试 fscheck 测试中看起来比较结果相等但 fscheck 说它们不相等的情况。
我有一个对象列表的生成器。如何生成可以从此生成器使用的列表?
let genListObj min max = Gen.listOf Arb.generate<obj> |> Gen.suchThat (fun l -> (l.Length >= min) && (l.Length <= max))
【问题讨论】:
-
使用
Gen.eval,见fscheck.codeplex.com/SourceControl/changeset/view/…。但是 FsCheck 会为失败的情况输出生成的数据,因此通常不需要这样做。 -
我以为我试过 Gen.eval。我再看看。对我来说,fsCheck 在属性测试中输出此数据的位置并不明显。向我的公共分支提交一些有趣的东西,并立即发布 #98 的长消息。
-
顺便说一下,避免使用 Gen.suchThat。它基本上会生成随机值,直到一些通过过滤器,因此可能需要很长时间。例如,最好先生成一个随机长度(使用例如 Gen.choose),然后生成该长度的列表(使用 Gen.listOfLength)。
-
感谢 Gen.listOfLength 的提示。我不知道我怎么忽略了这一点。
-
FsCheck 默认情况下没有设置为执行此操作,但编写函数相当容易。如果您发布您遇到问题的实际财产,我想我可以为您提供更好的帮助 - 特别是我不明白“fscheck 说他们不是” - fscheck 对平等没有任何特殊想法。