以下FsCheck测试有什么问题

时间:2014-07-21 02:41:00

标签: f# fscheck

这可能是非常简单的事情,但我是FsCheck的新手并且不确定为什么下面会引发错误(“Geneflect:type not handling 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集成。

1 个答案:

答案 0 :(得分: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 ...

工作。