我有一个方法可以返回一个我希望能够测试的IEnumerable。对于我将使用的测试输入,它将返回大约10个值。
在这种情况下编写测试的最简洁方法是什么?
更新:
非常感谢到目前为止的答案。我现在要研究几个有用的建议。
我认为我原来的问题措辞不是很好,更好的方法如下:
我想为一个返回IEnumerable KeyValuePair<string, uint>
的方法编写几个测试。对于我将使用的测试数据集,该方法将仅返回几个值。在大多数情况下约为10个值。
表达我的预期回报值并在MSTest中测试方法的最佳方法是什么?
答案 0 :(得分:3)
假设您知道应该返回什么结果,我发现Enumerable.SequenceEqual
很有用。 (创建一个包含预期结果的数组。)
在MoreLINQ中,我将它包装在一个extension method中,它将测试相等性并在两个序列不相等时转出它们。实际上,MoreLINQ测试主要是测试序列的相等性,所以它们可能会给你一些方便的例子:)
答案 1 :(得分:1)
if(YourMethod(input).Count() != 10) // test failed
Count
扩展方法适用于IEnumerable
,并且应该允许您确定系列中的项目数,如果这就是您所追求的全部内容。确保您包含System.Linq
。
答案 2 :(得分:1)
我发现在ColleAsserts中IEnumerables缺乏断言是不幸的。
因此我创建了以下内容:
internal static class EnumerableAsserts
{
public static void AreEqual<T>(
IEnumerable<T> expected,
IEnumerable<T> actual)
{
AreEqual(expected, actual, null);
}
public static void AreEqual<T>(
IEnumerable<T> expected,
IEnumerable<T> actual,
string text)
{
text = text == null ? "" : text +" : ";
if (expected == null)
Assert.Fail("{0}expected is null!", text);
if (actual == null)
Assert.Fail("{0}actual is null!", text);
if (ReferenceEquals(expected, actual))
return;
var e = expected.GetEnumerator();
var a = actual.GetEnumerator();
int count = 0;
while (e.MoveNext())
{
count++;
if (a.MoveNext())
{
if (!EqualityComparer<T>.Default.Equals(e.Current, a.Current))
Assert.Fail(
"{0}the {1}{2} item did not match expected '{3}' but was '{4}'",
text, count, MathUtils.GetOrdinal(count), e.Current, a.Current);
}
else
{
Assert.Fail(
"{0}there were {1} expected entries but {2} actual entries",
text, expected.Count(), actual.Count());
}
}
if (a.MoveNext())
Assert.Fail(
"{0}there were {1} expected entries but {2} actual entries",
text, expected.Count(), actual.Count());
}
}
答案 3 :(得分:0)
如果您正在使用MSTest,请按照我的假设查看CollectionAssert
课程。
如果你想写一个合适的单元测试,你必须比“大约10个值”更具体。
答案 4 :(得分:0)
不确定你得到了什么,你能澄清一下吗?
对我来说,测试应测试预期和意外情况。他们应该测试边界和典型情况。
在你的情况下,我将测试null,空,一个条目和多个条目(比如,你的典型十条)。您将知道生成IEnumerable的代码,因此您应该能够确定其他边界。