我正在尝试使用fscheck实现一个生成器和一个收缩器,这将产生两个不为空且彼此不同的字符串。为了做到这一点,我使用以下代码:
let nonWhiteSpaceString s =
not (String.IsNullOrWhiteSpace s) && not (String.exists ((=) '\000') s)
type DifferentNonWhiteSpace = | DifferentNonWhiteSpace of NonWhiteSpaceString*NonWhiteSpaceString
type DifferentNonWhiteSpaceGen =
static member DifferentNonWhiteSpace() =
let generator =
generate<String>
|> Gen.two
|> Gen.filter (fun (a,b) -> nonWhiteSpaceString a && nonWhiteSpaceString b && a<>b )
|> Gen.map (fun (a,b) -> DifferentNonWhiteSpace((NonWhiteSpaceString a),NonWhiteSpaceString(b)))
let shrinker (DifferentNonWhiteSpace(a,b)) =
let seqA = a.Get.ToCharArray()
|> shrink
|> Seq.map String
b.Get.ToCharArray()
|> shrink
|> Seq.map String
|> Seq.map2 (fun x y -> if x <> y then Some(DifferentNonWhiteSpace(NonWhiteSpaceString x,NonWhiteSpaceString y)) else None) seqA
|> Seq.choose id
fromGenShrink (generator,shrinker)
我像在测试中一样使用它,如下所示:
testProperty "calculate Xml against different Prefix should produce youpi" <| fun (DifferentNonWhiteSpace(prefix1,prefix2)) ->
let xml1 = createXml <| changePrefix prefix1
let xml2 = createXml <| changePrefix prefix2
let actual = calculate xml1 xml2
Expect.equal actual Youpi "return youpi"
发电机似乎还可以,但是收缩器不是我期望的那样:
1次测试后失败。参数: DifferentNonWhiteSpace(NonWhiteSpaceString“ K”,NonWhiteSpaceString“▲”) 缩小3次即可: 不同NonWhiteSpace(NonWhiteSpaceString“ a”,NonWhiteSpaceString“ a”) 结果: 例外 Expecto.AssertException:返回Bouh。
缩小后的数据中我不应具有相同的值:
不同NonWhiteSpace(NonWhiteSpaceString“ a”,NonWhiteSpaceString “ a”)
有人可以指出我做错了什么吗?
谢谢
[编辑]实际上,发生器也有问题。
Failed after 11 tests. Parameters:
DifferentNonWhiteSpace (NonWhiteSpaceString "v",NonWhiteSpaceString "v")
Result:
Exception
Expecto.AssertException: return Bouh.
很奇怪...
致敬Kurt Schelfthout评论,我忘了使用
testPropertyWithConfig config ....
而不是
testProperty ....
为了使用我的自定义任意内容:
let config =
{
FsCheckConfig.defaultConfig with
arbitrary=
[
typeof<DifferentNonWhiteSpaceGen>
]
}