如何为返回IEnumerable的方法编写测试

时间:2009-09-04 16:31:06

标签: c# visual-studio-2008 testing

我有一个方法可以返回一个我希望能够测试的IEnumerable。对于我将使用的测试输入,它将返回大约10个值。

在这种情况下编写测试的最简洁方法是什么?

更新:

非常感谢到目前为止的答案。我现在要研究几个有用的建议。

我认为我原来的问题措辞不是很好,更好的方法如下:

我想为一个返回IEnumerable KeyValuePair<string, uint>的方法编写几个测试。对于我将使用的测试数据集,该方法将仅返回几个值。在大多数情况下约为10个值。

表达我的预期回报值并在MSTest中测试方法的最佳方法是什么?

5 个答案:

答案 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的代码,因此您应该能够确定其他边界。