我正在使用 dotCover 来分析单元测试的代码覆盖率,并且得到一些奇怪的结果...我有一个迭代器方法,其覆盖范围不完整,但未覆盖的语句只是右大括号在该方法的末尾。
这是我正在测试的方法:
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%,所以这可能与编译器优化有关。