dimanche 12 juin 2016

How to test method which returns IEnumerable

I've just started to learn testing, and have following problem.My method takes IEnumerable<int> parameter and returns same.Basically, it is method for merging two sorted arrays/lists but since I'm reading values from files, I don't want to use unnecessary memory for creating list or array so I have decided to use IEnumerable. I have one method which reads file and converts all the numbers that finds in file into integers and returns IEnumerable<int>. So the following method use that result and merge those sorted integers.

 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;
        }
    }

I want to test functionality of this method and create test cases using Nunit, but I don't know what collection should I create for testing purpose.Idea is to do something like following :

[Test]
public static void GetSortedIntegersTest()
{
    IEnumerable<int> first = new IEnumerable<int>() { 0 };
    IEnumerable<int> second = new IEnumerable<int>() { 1, 2 };
    IEnumerable<int> actual;
    IEnumerable<int> expected = { 0, 1, 2 };
    actual = GetSortedIntegers(first, second);
    CollectionAssert.AreEqual(expected, actual);
}

Thank you for Your advice.

Aucun commentaire:

Enregistrer un commentaire