2

这可能很简单,但我是 FsCheck 的新手,不知道为什么下面会引发错误(“Geneflect:类型未处理 System.Numerics.BigInteger”)?

open System.Numerics

type NumericGenerator =
    /// Generating BigIntegers (though only in the regular integer range for now)
    static member BigInt() =
        { new Arbitrary<System.Numerics.BigInteger>() with
            override x.Generator =
                Arb.generate<int>
                |> Gen.map (fun i -> new BigInteger(i)) }


[<Property>]
let ``Simple test`` (b: BigInteger) =
    Arb.register<NumericGenerator> |> ignore
    b + 1I = 1I + b

这是将 FsCheck 与 xUnit 集成一起使用。

4

1 回答 1

2

FsCheck 在调用您的测试之前尝试生成一个 BigInteger,因为 Arb.register 调用在您的测试方法本身中。然后它尝试通过反射来做到这一点,但失败了。

您可以通过将其作为参数添加到您的属性来告诉 FsCheck 您的自定义任意实例。

[<Property(Arbitrary=[|typeof<NumericGenerator>|])>]

此外,您可以将 ArbitraryAttribute 添加到测试的封闭模块中,以便为模块中的所有属性注册该任意实例。有关一些示例,请参阅https://github.com/fsharp/FsCheck/blob/master/tests/FsCheck.Test/Runner.fs

最后一个提示 - 如果您生成的类型很容易转换为/从另一种已生成的类型转换,您可以使用该Arb.convert方法轻松创建生成和收缩器。就像是:

Arb.Default.Int32() |> Arb.convert ...

应该工作。

于 2014-07-21T11:55:15.560 回答