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

これは、xUnit 統合で FsCheck を使用しています。

4

1 に答える 1

2

Arb.register 呼び出しはテスト メソッド自体にあるため、FsCheck はテストを呼び出す前に BigInteger を生成しようとしています。次に、リフレクションを介してそれを試みますが、失敗します。

プロパティに引数として追加することで、カスタムの任意のインスタンスについて 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 に答える