如何测试返回IEnumerable <int>的方法?

时间:2016-06-12 18:07:58

标签: c# algorithm testing nunit

我刚刚开始学习测试,并且遇到了以下问题。我的方法接受IEnumerable<int>参数并返回相同的内容。基本上,它是合并两个已排序arrays/lists的方法但是因为我&# 39;从文件中读取值,我不想使用不必要的内存来创建list or array,所以我决定使用IEnumerable。我有一个方法可以读取文件并将文件中找到的所有数字转换为integers并返回IEnumerable<int>。因此,以下方法使用该结果并合并那些排序的整数。

public static IEnumerable<int> GetSortedIntegers(IEnumerable<int> first , IEnumerable<int> second)
{
    var item1 = first.GetEnumerator();
    var item2 = second.GetEnumerator();

    bool item1HasNext = item1.MoveNext();
    bool item2HasNext = item2.MoveNext();

    while (item1HasNext && item2HasNext)
    {
        if (item1.Current > item2.Current)
        {
            yield return item2.Current;
            item2HasNext = item2.MoveNext();
        }
        else if(item1.Current == item2.Current)
        {
            yield return item2.Current;
            item2HasNext = item2.MoveNext();
            item1HasNext = item1.MoveNext();
        }
        else
        {
            yield return item1.Current;
            item1HasNext = item1.MoveNext();
        }
    }
    while (item1.MoveNext())
    {
        yield return item1.Current;
    }
    while (item2.MoveNext())
    {
        yield return item2.Current;
    }
}

我想测试此方法的功能并使用Nunit创建测试用例,但我不知道我应该为测试目的创建哪些集合。想要做的事情如下:

[Test]
public static void GetSortedIntegersTest()
{           
    var first = new List<int>() { 0 };
    var second = new List<int>() { 1, 2 };

    var expected = new List<int>{ 0, 1, 2 };
    var actual = GetSortedIntegers(first, second);
    CollectionAssert.AreEqual(expected, actual);
}

感谢您的建议。

2 个答案:

答案 0 :(得分:2)

如果要确定两个序列是否包含相同顺序的相同元素,请调用Enumerable.SequenceEqual。没有必要将合并的返回序列转换为具体集合。

所以:

var expected = new List<int>{0, 1, 2};
var actual = GetSortedIntegers(first, second);
Assert.IsTrue(expected.SequenceEqual(actual));

答案 1 :(得分:0)

CollectionAssert适用于ICollection,因此您应将actual转换为列表。

[Test]
public static void GetSortedIntegersTest()
{           
    var first = new List<int>() { 0 };
    var second = new List<int>() { 1, 2 };

    var expected = new List<int>{ 0, 1, 2 };
    var actual = GetSortedIntegers(first, second);
    CollectionAssert.AreEqual(expected, actual.ToList());
}

您当前的测试将失败,但它是RGR的开始。现在你可以重构并重新测试,直到你变绿。

您可以查看此Q&amp; A Is there an easy way to merge two ordered sequences using LINQ?