Я использую 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
unit test:
[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
.
Что касается второй непокрытой закрывающей скобки, я не знаю, что она означает... Я предполагаю, что это связано с тем, как компилятор преобразует блок итератора.
Может ли кто-нибудь пролить свет на то, что эти два "заявления", и почему они не выполняются?
EDIT: Питер поставил очень хороший вопрос: результаты, показанные выше, были получены при запуске тестов в отладочной версии. Если я запускаю тесты в выпуске, охват метода CommonPrefixImpl
равен 100%, поэтому он, вероятно, связан с оптимизацией компилятора.