【问题标题】:Readable unit testing of a yielded sequence?生成序列的可读单元测试?
【发布时间】:2012-03-05 00:42:31
【问题描述】:

假设我有一些返回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 测试套件 + Pex。

【问题讨论】:

    标签: c# unit-testing yield sequences


    【解决方案1】:

    怎么样:

    [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 个。

    【讨论】:

    • 正如我所说,斐波那契只是一个例子。我有与 BigInteger 相同的方法,或者像 IEnumerable&lt;T[]&gt; GetPermutations(T[] source) 这样的其他方法,如果不是无限的话,它会产生大量的项目。无论如何,谢谢你的回答。
    【解决方案2】:
    CollectionAssert.AreEqual(new[] {0,1,1,2,3,5}, MyClass.Fibonacci().Take(6).ToList());
    

    【讨论】:

    • 以前从未见过CollectionAssert :) 这应该可以简化大部分序列单元测试!谢谢
    • @SteveB 我没有投反对票,但我认为 CollectionAssert 采用 ICollection(在 MSTest 中)的原因。而 Take(n) 将返回一个 IEnumerable,因此实际上不会编译。
    • @RichK:一个简单的.ToList() 就可以解决问题。 downvoter 应该通知 Matt 而不是 downvote。
    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2016-05-09
    • 2012-07-10
    • 2010-10-04
    • 2020-04-28
    相关资源
    最近更新 更多