强制FsCheck生成NonEmptyString以区分string类型的union字段

Edw*_*rst 7 testing f# fscheck

我试图用FsCheck实现以下行为:我想创建一个生成MyUnion类型实例的生成器,每个字符串字段都是非null /空.

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

type MyUnion =
    | A of int * int * string * string
    | B of MyNestedUnion
Run Code Online (Sandbox Code Playgroud)

我的'真实'类型比它更大/更深MyUnion,并且FsCheck能够毫无问题地生成实例,但是联合情况的字符串字段有时是空的.(例如,它可能会生成B (Y (123, "")))

也许有一些明显的方法可以将FsCheck NonEmptyString和它的支持结合起来生成我遗漏的任意联合类型?

任何正确方向的提示/指针都非常感谢.

谢谢!

scr*_*wtp 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
Run Code Online (Sandbox Code Playgroud)

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

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