FsCheck有一些整洁的默认Arbitrary
类型来生成测试数据。但是如果我的测试日期之一取决于另一个呢?FsCheck:如何生成依赖于其他测试数据的测试数据?
例如,考虑使获得的子永远不能比输入的字符串长的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
长,导致异常。
收缩:NonEmptyString“a”PositiveInt 2异常:System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。
我可以防止与if (input.Length < length) return true;
比较,但这样我最终会进行大量的测试运行属性甚至没有检查。
如何让FsCheck只生成不超过输入字符串的PositiveInt
?我相信我必须使用Gen<T>
类,但它的接口只是海拉混乱,我...我尝试以下,但仍然有PositiveInt
小号超过字符串:
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();
https://fscheck.github.io/FsCheck/TestData.html – MethodMan
我通过这个网站看起来已经多次,还是没能想出一个办法做我想做什么。 –