9

MyUnionFsCheck で次の動作を実現しようとしています:すべての文字列フィールドが非 null/空である型のインスタンスを生成するジェネレータを作成したいと考えています。

type MyNestedUnion =
    | X of string
    | Y of int * string

type MyUnion =
    | A of int * int * string * string
    | B of MyNestedUnion

私の「実際の」型は よりもはるかに大きく/深くMyUnion、FsCheck は問題なくインスタンスを生成できますが、ユニオン ケースの文字列フィールドが空になることがあります。(たとえば、生成される可能性がありますB (Y (123, "")))

おそらく、FsCheckNonEmptyStringと、私が見逃している任意のユニオン型を生成するためのサポートを組み合わせる明らかな方法があるでしょうか?

正しい方向へのヒント/ポインタは大歓迎です。

ありがとう!

4

1 に答える 1

5

これは、プロパティ ベースのテストの粒度に反しますが (有効なテスト ケースが生成されるのを明示的に防止するという点で)、空でない文字列ジェネレーターをすべての文字列に使用するように接続できます。

type Alt =
    static member NonEmptyString () : Arbitrary<string> =
        Arb.Default.NonEmptyString()
        |> Arb.convert
            (fun (nes : NonEmptyString) -> nes.Get)
            NonEmptyString.NonEmptyString

Arb.register<Alt>()

let g = Arb.generate<MyUnion>

Gen.sample 1 10 g

マッピングはグローバルであるため、テスト後にデフォルトのジェネレーターを再登録する必要があることに注意してください。

より標準的な解決策は、デフォルトの派生ジェネレーターを使用してから、無効な文字列を含む値をフィルター処理することです (つまり==>、 を使用します)。

于 2017-08-15T20:32:16.693 に答える