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.
怎么样的:
[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个.