产生序列的可读单元测试?

Ste*_*e B 2 c# unit-testing yield sequences

假设我有一些返回IEnumerable<int>对象的方法.此方法使用yield return关键字生成无限序列.Fibonacci算法的示例:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何为这样的序列正确创建单元测试?适当的我也意味着可读.

我可以写这样的单元测试:

[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();
}
Run Code Online (Sandbox Code Playgroud)

这个测试有效,但我不认为它是可读的.什么是一般的(Fibonacci alogrithm只是一个例子)编写序列单元测试的指南?

PS:我正在使用Visual Studio OOB测试套件+ Pex.

Ani*_*Ani 6

怎么样的:

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

    Assert.IsTrue(actual.Take(6).SequenceEqual(expected));
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我会指出你并没有真正的无限序列,因为只有很多斐波纳契系列的成员可以适应long(或任何固定大小的数据类型).你也可以测试所有92个.