【发布时间】:2018-03-31 20:43:33
【问题描述】:
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 的实现肯定是正确的,但这个属性失败了,因为最终会生成一个比生成的NonEmptyString 更长的PositiveInt,从而导致异常。
收缩:NonEmptyString "a" PositiveInt 2 异常:System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。
我可以保护与 if (input.Length < length) return true; 的比较,但这样我最终会进行大量测试运行,甚至没有检查该属性。
如何告诉 FsCheck 只生成不超过输入字符串的PositiveInts?我想我必须使用 Gen<T> 类,但它的界面让我很困惑......我尝试了以下但仍然得到 PositiveInts 超过字符串:
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();
【问题讨论】:
-
我已经多次浏览了这个网站,但仍然无法找到一种方法来做我想做的事。
标签: c# fscheck property-based-testing