Читаемое юнит-тестирование данной последовательности? - PullRequest
2 голосов
/ 13 февраля 2012

Предположим, у меня есть какой-то метод, который возвращает объект IEnumerable<int>.Эти методы используют ключевое слово yield return для создания бесконечной последовательности.Пример алгоритма Фибоначчи:

public static IEnumerable<long> Fibonacci()
{
    long x = 0L;
    long y = 1L;
    long z;
    yield return x;
    yield return y;
    while (true)
    {
        z = x + y;
        yield return z;
        y = x;
        x = z;
    }
}

Как правильно создать модульный тест для такой последовательности?Под словом я имею в виду читабельность.

Я могу написать модульные тесты следующим образом:

[TestMethod]
public void FibonacciTest()
{
    var actual = MyClass.Fibonacci();

    var @enum = actual.GetEnumerator();

    Assert.IsTrue(@enum.MoveNext();
    Assert.AreEqual(@enum.Current), 0);
    Assert.IsTrue(@enum.MoveNext();
    Assert.AreEqual(@enum.Current), 1);
    Assert.IsTrue(@enum.MoveNext();
    Assert.AreEqual(@enum.Current), 1);
    Assert.IsTrue(@enum.MoveNext();
    Assert.AreEqual(@enum.Current), 2);
    Assert.IsTrue(@enum.MoveNext();
    Assert.AreEqual(@enum.Current), 3);
    Assert.IsTrue(@enum.MoveNext();
    Assert.AreEqual(@enum.Current), 5);
    Assert.IsTrue(@enum.MoveNext();
}

Этот тест работает, но я не думаю, что он читаемый.Каковы общие (аллогритм Фибоначчи был только примером) рекомендации по написанию модульных тестов для последовательностей?

PS: я использую Visual Studio OOB Test Suite + Pex.

Ответы [ 2 ]

6 голосов
/ 13 февраля 2012

Как насчет чего-то вроде:

[TestMethod]
public void FibonacciFirstSixTest()
{
    var actual = MyClass.Fibonacci();
    int[] expected = { 0, 1, 1, 2, 3, 5 };

    Assert.IsTrue(actual.Take(6).SequenceEqual(expected));
}

Кстати, я хотел бы отметить, что у вас на самом деле нет бесконечной последовательности, поскольку существует только очень много членов ряда Фибоначчи, которые могут вписаться в long (или любой фиксированный размер-тип данных в этом отношении). Вы можете также проверить все 92 из них.

4 голосов
/ 13 февраля 2012
var expectedFibSequence = new[] {0,1,1,2,3,5};
CollectionAssert.AreEqual(
    expected,
    MyClass.Fibonacci().Take(expected.Length).ToList());
...