C#-FsCheck:如何生成依赖于其他测试数据的测试数据?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-FsCheck:如何生成依赖于其他测试数据的测试数据?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1601字,纯文字阅读大概需要3分钟。
内容图文
![C#-FsCheck:如何生成依赖于其他测试数据的测试数据?](/upload/InfoBanner/zyjiaocheng/685/9d9e89def7aa4e0d8736dc42c42bd903.jpg)
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,从而导致异常.
Shrunk: NonEmptyString “a” PositiveInt 2 with exception: System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
我可以用if(input.Length< length)返回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();
解决方法:
您可以使用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:如何生成依赖于其他测试数据的测试数据?全部内容,希望文章能够帮你解决C#-FsCheck:如何生成依赖于其他测试数据的测试数据?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。