【问题标题】:What's wrong with the following FsCheck test以下 FsCheck 测试有什么问题
【发布时间】:2014-07-21 02:40:59
【问题描述】:

这可能很简单,但我是 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 集成一起使用。

【问题讨论】:

    标签: f# fscheck


    【解决方案1】:

    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 ...
    

    应该工作。

    【讨论】:

    • 谢谢,我会试试的,但是直到我下班回家后才能做到这一点。我确实尝试过在封闭模块中进行注册,但这也给了我一个错误(必须再次查看确切的文本才能回忆起什么),即使我使用在 FsCheck 文档中找到的 EventInt 类型进行了尝试。也许我搞砸了,如果我没有(或没有以对我来说明显的方式这样做),我会报告回来
    • 这可能有点棘手,因为不同模块中的静态初始化问题等。这一切都变得有点棘手。我描述的方式(使用 Property 或 Arbitrary 属性)是推荐且可靠的方式。
    • 好的,我会用它。谢了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多