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
会生成比生成的更长的 a,NonEmptyString
从而导致异常。
收缩:NonEmptyString "a" PositiveInt 2 异常:System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。
我可以与 an 进行比较,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();