强制 FsCheck 生成 NonEmptyString,用于区分字符串类型的联合字段
Force FsCheck to generate NonEmptyString for discriminating union fields of type string
我正在尝试使用 FsCheck 实现以下行为:我想创建一个生成器,它将生成一个 MyUnion
类型的实例,每个字符串字段都是 non-null/empty。
type MyNestedUnion =
| X of string
| Y of int * string
type MyUnion =
| A of int * int * string * string
| B of MyNestedUnion
我的'real'类型比MyUnion
类型多larger/deeper,FsCheck能够毫无问题地生成一个实例,但联合案例的字符串字段有时为空. (例如它可能会生成 B (Y (123, ""))
)
也许有一些明显的方法可以结合 FsCheck 的 NonEmptyString
和它对生成我缺少的任意联合类型的支持?
非常感谢任何方向正确的 tips/pointers。
谢谢!
这违背了基于 属性 的测试的原则(因为您明确阻止生成有效的测试用例),但您可以连接非空字符串生成器以用于所有字符串:
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
请注意,您需要在测试后重新注册默认生成器,因为映射是全局的。
一个更循规蹈矩的解决方案是使用默认派生生成器,然后过滤包含无效字符串的值(即使用 ==>
),但您可能会发现它对于特别深的嵌套不可行类型。
我正在尝试使用 FsCheck 实现以下行为:我想创建一个生成器,它将生成一个 MyUnion
类型的实例,每个字符串字段都是 non-null/empty。
type MyNestedUnion =
| X of string
| Y of int * string
type MyUnion =
| A of int * int * string * string
| B of MyNestedUnion
我的'real'类型比MyUnion
类型多larger/deeper,FsCheck能够毫无问题地生成一个实例,但联合案例的字符串字段有时为空. (例如它可能会生成 B (Y (123, ""))
)
也许有一些明显的方法可以结合 FsCheck 的 NonEmptyString
和它对生成我缺少的任意联合类型的支持?
非常感谢任何方向正确的 tips/pointers。
谢谢!
这违背了基于 属性 的测试的原则(因为您明确阻止生成有效的测试用例),但您可以连接非空字符串生成器以用于所有字符串:
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
请注意,您需要在测试后重新注册默认生成器,因为映射是全局的。
一个更循规蹈矩的解决方案是使用默认派生生成器,然后过滤包含无效字符串的值(即使用 ==>
),但您可能会发现它对于特别深的嵌套不可行类型。