强制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
请注意,由于映射是全局的,因此您需要在测试之后重新注册默认生成器。
更多的书籍解决方案是使用默认的派生生成器,然后过滤包含无效字符串的值(即使用==>
),但是对于特别深的嵌套类型您可能发现它不可行。