Svi*_*ish 11 c# ienumerable unit-testing
假设我举例说这个类生成Fibonacci数:
public class FibonacciSequence : IEnumerable<ulong>
{
public IEnumerator<ulong> GetEnumerator()
{
var a = 0UL;
var b = 1UL;
var c = a + b;
while (true)
{
yield return c;
c = a + b;
a = b;
b = c;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以编写一个测试,确保序列中的n个第一个数字是正确的.
[Test]
public void GetEnumerator_FirstFifteenNumbers_AreCorrect()
{
var sequence = new FibonacciSequence().Take(15).ToArray();
CollectionAssert.AreEqual(sequence, new[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610});
}
Run Code Online (Sandbox Code Playgroud)
但是,当我检查覆盖范围时,我会看到IEnumerable.GetEnumerator()方法未经测试,我的覆盖率将低于它真正需要的范围.很公平.但是我该如何测试这种方法呢?
你通常如何处理这个问题?
Jon*_*eet 11
编辑:根据Marc所说的更新.
那么你可以通过以下方式获得覆盖:
// Helper extension method
public static IEnumerable AsWeakEnumerable(this IEnumerable source)
{
foreach (object o in source)
{
yield return o;
}
}
...
[Test]
public void GetEnumerator_FirstFifteenNumbers_AreCorrect()
{
IEnumerable weak = new FibonacciSequence().AsWeakEnumerable();
var sequence = weak.Cast<int>().Take(15).ToArray();
CollectionAssert.AreEqual(sequence,
new[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610});
}
Run Code Online (Sandbox Code Playgroud)
请注意,weak声明为非泛型IEnumerable类型...这意味着您需要调用Cast它来将每个返回的对象强制转换为int.
我不确定我会打扰......
我不会测试它。我会尝试从覆盖工具中过滤掉该方法。我认为报道应该检查我想要报道的事情,而不是所有事情。从其他评论来看,您似乎正在使用 TestDriven.Net。我不知道过滤效果如何,但使用 NCover 是可能的。您也可以尝试 PartCover。
| 归档时间: |
|
| 查看次数: |
6524 次 |
| 最近记录: |