这可能是非常简单的事情,但我是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集成。
答案 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 ...
工作。