2

我有以下代码:

var gen = from x in Arb.Generate<int>()
from int y in Gen.Choose(5, 10)
where x > 5
select new tuple { Fst = x, Snd = y };

我可以跑

Prop.ForAll<tuple>(c =>
      Console.WriteLine($"{c.Fst}, {c.Snd}")
).Check(Configuration.Default);

我看到了构造生成器和定义属性的所有方法。

但我只是没有足够快地找到如何一起使用它们。

4

1 回答 1

2

您需要使用 FsCheck 注册自定义生成器。请参阅 FSCheck 文档

简而言之,创建一个类来保留您的自定义生成器。有一个公共静态方法返回一个Arbitrary<T>whereT是您正在生成的类型。

在您的示例中,您需要将生成器包装在对Arb.From(...).

public class MyGenerators {
    public static Arbitrary<tuple> Tuple() {
        return Arb.From(from x in Arb.Generate<int>()
                        from int y in Gen.Choose(5, 10)
                        where x > 5
                        select new tuple { Fst = x, Snd = y });
    }
}

最后,Arb.Register<MyGenerators>()在运行测试之前调用。

于 2018-01-19T12:22:11.360 回答