gpt4 book ai didi

c# - FsCheck:如何生成依赖于其他测试数据的测试数据?

转载 作者:太空狗 更新时间:2023-10-30 01:00:22 24 4
gpt4 key购买 nike

FsCheck 有一些简洁的默认值 Arbitrary类型来生成测试数据。但是,如果我的一个考试日期取决于另一个考试日期怎么办?

例如,考虑 string.Substring() 的属性结果子字符串永远不能比输入字符串长:

[Fact]
public void SubstringIsNeverLongerThanInputString()
{
Prop.ForAll(
Arb.Default.NonEmptyString(),
Arb.Default.PositiveInt(),
(input, length) => input.Get.Substring(0, length.Get).Length <= input.Get.Length
).QuickCheckThrowOnFailure();
}

虽然执行Substring当然是正确的,这个属性失败了,因为最终一个PositiveInt将生成比生成的 NonEmptyString 更长的导致异常。

Shrunk: NonEmptyString "a" PositiveInt 2 with exception: System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.

我可以保护与 if (input.Length < length) return true; 的比较但那样的话,我最终会进行大量的测试运行,甚至都没有检查该属性。

如何告诉 FsCheck 只生成 PositiveInt s 不超过输入字符串?我想我必须使用 Gen<T>类,但它的界面让我很困惑...我尝试了以下但仍然得到 PositiveInt s 超出字符串:

var inputs = Arb.Default.NonEmptyString();
// I have no idea what I'm doing here...
var lengths = inputs.Generator.Select(s => s.Get.Length).ToArbitrary();

Prop.ForAll(
inputs,
lengths,
(input, length) => input.Get.Substring(0, length).Length <= input.Get.Length
).QuickCheckThrowOnFailure();

最佳答案

您可以使用 SelectMany 创建依赖于从另一个生成的值的生成器。这也允许您使用 LINQ 查询语法,例如

var gen = from s in Arb.Generate<NonEmptyString>()
from i in Gen.Choose(0, s.Get.Length - 1)
select Tuple.Create(s, i);

var p = Prop.ForAll(Arb.From(gen), t =>
{
var s = t.Item1.Get;
var len = t.Item2;
return s.Substring(0, len).Length <= s.Length;
});

Check.Quick(p);

关于c# - FsCheck:如何生成依赖于其他测试数据的测试数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46836197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com