如何测试函数返回IEnumerable <integer> </integer>

时间:2010-12-17 21:33:17

标签: c# testing nunit ienumerable

我正在尝试测试一个函数

public static IEnumerable<Integer> Divisors(Integer n)
{
    int max = (int)System.Math.Sqrt(n);

    if (n != 0)
        yield return 1;

    for (int i = 2; i <= max; i++)
        if (n % i == 0)
            yield return i;
}

我需要编写一个像

这样的测试函数
[Test]
public void DivisorsTest()
{   
    Integer n = 0; 
    IEnumerable<Integer> expected = 0 ; //error
    IEnumerable<Integer> actual;
    actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
    Assert.AreEqual(expected, actual);
}

如何修改此行以测试输出所需的输出,以测试不仅为零的返回值

5 个答案:

答案 0 :(得分:2)

检查整个馆藏有各种技巧。看起来输入为零,你不希望返回任何值(即空集),所以你可以这样做:

Assert.IsFalse(actual.Any()); // There should not be any elements returned

对于更复杂的输出,通常更容易将结果放入数组中,并按索引检查结果,如下所示:

var results = actual.ToArray();
Assert.AreEqual(5, results.Count);
Assert.AreEqual(1, results[0]);
Assert.AreEqual(2, results[1]);
// etc.

答案 1 :(得分:0)

难道你不能使用这样的东西(对不起,它需要Linq):

[Test]
public void DivisorsTest()
{   
    int n = 0; 
    int expected = 0; //error
    IEnumerable<Integer> actual;
    actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
    Assert.IsTrue(actual.All(x => x != expected));
}

答案 2 :(得分:0)

您还可以将预期初始化为空的可枚举(即零元素),如此

IEnumerable<int> expected = System.Linq.Enumerable.Empty<int>();

MSDN Reference for Enumerable

答案 3 :(得分:0)

我经常使用类似的东西:

var expected = new int[] { /* expected values */ };
var actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
Assert.IsTrue(expected.SequenceEquals(actual));

缺点是断言默认错误消息不是很具描述性:

Expected: True
But was: False

相反,您可以使用CollectionAssert.AreEquivalent,它会提供更详细的错误消息,但它也不理想......如果您使用Linq查询,则消息可能如下所示:

Expected: equivalent to < 0, 1, 3, 4, 6, 7, 9, 10 >
But was:  <System.Linq.Enumerable+<WhereIterator>d__0`1[System.Int32]>

(至少在NUnit 2.4.8中,也许我应该升级到更新版本......)

答案 4 :(得分:0)

好的,谢谢大家的回答,这就是我用你的答案做的事情

测试功能将是: 1-当您希望该函数不会返回任何值时

[Test]
   public void DivisorsTest_01()
   {   
       Integer n = 0; 
       IEnumerable<Integer> actual;
       actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
       Assert.IsFalse(actual.Any()); // There should not be any elements returned so empty
   }

2-所有你需要的是将o / p转换成数组并使用它:

[Test]
   public void DivisorsTest_03()
   {
       Integer n = 9;
       Integer[] expected = new Integer[3] { 1,3,9 };
       IEnumerable<Integer> actual;
       actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
       var actual1 = actual.ToArray();

       Assert.AreEqual(expected[0], actual1[0]);
       Assert.AreEqual(expected[1], actual1[1]);
       Assert.AreEqual(expected[2], actual1[2]);

   }

3-有时你会期望输出是异常的,所以不要忘记写:

[Test]
[ExpectedException]

在功能之前。

再次感谢大家