强制FsCheck生成NonEmptyString用于区分字符串类型的联合字段

问题描述:

我试图用FsCheck实现以下行为:我想创建一个生成器,该生成器将生成MyUnion类型的实例,每个字符串字段都是非-null /空。强制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及其支持生成我失踪的任意联合类型?

任何提示/指针在正确的方向非常赞赏。

谢谢!

这违背基于性能测试的颗粒(在你明确地防止产生有效的测试用例),但你可以连线了非空字符串发生器用于所有字符串:

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 

请注意,由于映射是全局的,因此您需要在测试之后重新注册默认生成器。

更多的书籍解决方案是使用默认的派生生成器,然后过滤包含无效字符串的值(即使用==>),但是对于特别深的嵌套类型您可能发现它不可行。