我使用dotCover来分析我的单元测试代码覆盖率,并且我得到一些奇怪的结果......我有一个iterator方法,其覆盖范围是不完整的,但没有覆盖的语句是在结束括号在该方法的结束。
下面是我测试的方法:
public static IEnumerable<T> CommonPrefix<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
source.CheckArgumentNull("source");
other.CheckArgumentNull("other");
return source.CommonPrefixImpl(other, comparer);
}
private static IEnumerable<T> CommonPrefixImpl<T>(
this IEnumerable<T> source,
IEnumerable<T> other,
IEqualityComparer<T> comparer)
{
comparer = comparer ?? EqualityComparer<T>.Default;
using (IEnumerator<T> en1 = source.GetEnumerator(),
en2 = other.GetEnumerator())
{
while (en1.MoveNext() && en2.MoveNext())
{
if (comparer.Equals(en1.Current, en2.Current))
yield return en1.Current;
else
yield break;
}
} // not covered
} // not covered
单元测试:
[Test]
public void Test_CommonPrefix_SpecificComparer()
{
var first = new[] { "Foo", "Bar", "Baz", "Titi", "Tata", "Toto" };
var second = new[] { "FOO", "bAR", "baz", "tata", "Toto" };
var expected = new[] { "Foo", "Bar", "Baz" };
var actual = first.CommonPrefix(second, StringComparer.CurrentCultureIgnoreCase);
Assert.That(actual, Is.EquivalentTo(expected));
}
和覆盖率结果:
我假设的右括号using
块实际上是对呼叫Dispose
的统计员; 但随后,它为什么不执行? 我首先怀疑NUnit的未处置的枚举,但我得到了同样的结果,如果我做一个foreach的actual
。
而对于第二未覆盖右括号,我不知道它代表什么?我想这是关系到编译器是如何将迭代器块。
任何人都可以阐明这两位“声明”有一些光,为什么不执行他们?
编辑:彼得提出了一个很好的问题:在运行调试版本的测试时,上面显示的结果获得。 如果我运行一个发布版本的测试,覆盖CommonPrefixImpl
方法是100%,所以它可能涉及到编译器优化。