2017-08-15 31 views
7

FsCheckで以下の動作を実現しようとしています。MyUnion型のインスタンスを生成するジェネレータを作成したいと思います。 -null/empty。FsCheckで型文字列の共用体フィールドを区別するためのNonEmptyStringを生成する

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, ""))を生成するかもしれません)

おそらく、FsCheckのNonEmptyStringと私が紛失している任意の共用体型を生成するためのサポートを組み合わせる明確な方法がありますか?

正しい方向のヒント/ポインタがあれば幸いです。

ありがとうございます!

答えて

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 

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

デフォルトの派生ジェネレータを使用し、無効な文字列を含む値をフィルタリングする(つまり、==>を使用)が、特に深いネストされたタイプでは実現できないことがあります。

関連する問題