Using FsCheck https://github.com/fsharp/FsCheck,Haskell QuickCheck 测试库的 F# 版本,用于生成测试C# https://github.com/fsharp/FsCheck/blob/master/FsCheck.CSharpExamples/Program.cs,我发现随机字符串生成器不会生成空字符串。
using FsCheck.Fluent;
Spec.ForAny<string>(s => s != null).QuickCheck(); // always pass
此外,似乎没有设计处理空字符串,但我还没有设法确定它从文档中 https://github.com/fsharp/FsCheck/blob/master/Docs/Documentation.md。例如,仅在两个字符串(其中一个为空)之间进行选择是行不通的:
var strings = Any.ValueIn<string>(null, "non-null string");
Spec.For(strings, s => true).QuickCheck(); // throws null ref exception
字符串似乎是一种特殊情况,因为它处理定制对象,例如
class Thing {}
与空值混合时:
var objects = Any.ValueIn(null, new Thing());
Spec.For(objects, s => true).QuickCheck(); // pass
我试图对此进行深入研究,看来您已经发现了 FsCheck 中的一个错误。
问题似乎出在 Arbitrary.fs 文件中,并且实际上仅与字符串相关。我必须替换它,他们在字符串上调用 ToCharArray
static member String() =
{ new Arbitrary<string>() with
override x.Generator = Gen.map (fun chars -> new String(List.toArray chars)) generate
override x.Shrinker s = s.ToCharArray() |> Array.toList |> shrink |> Seq.map (fun chars -> new String(List.toArray chars))
}
有了这个
static member String() =
{ new Arbitrary<string>() with
override x.Generator = Gen.map (fun chars -> new String(List.toArray chars)) generate
override x.Shrinker s =
match s with
| null -> seq {yield null;}
| _ -> s.ToCharArray() |> Array.toList |> shrink |> Seq.map (fun chars -> new String(List.toArray chars))
}
您可能想向 fscheck 开发人员提出这个问题here https://github.com/fsharp/FsCheck/issues并检查我的修复是否运行良好 - 可能有更好的方法来实现它,但对于已经知道代码的人来说会更简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)