Странные результаты тестового покрытия для блока итератора, почему эти операторы не выполняются?

Я использую 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));
    }

И результаты покрытия:

coverage results

Я предполагаю, что закрывающая скобка блока usingна самом деле является вызовом Disposeдля перечислителей; но тогда почему он не выполняется? Сначала я подозревал, что NUnit не удаляет перечислители, но я получаю тот же результат, если выполняю foreach для actual.

Что касается второй незакрытой закрывающей скобки, я понятия не имею, что она означает... Думаю, это связано с тем, как компилятор преобразует блок итератора.

Может ли кто-нибудь пролить свет на то, что представляют собой эти два «утверждения» и почему они не выполняются?


РЕДАКТИРОВАТЬ :Питер поднял очень хороший вопрос :результаты, показанные выше, были получены при выполнении тестов на отладочной сборке . Если я запускаю тесты на сборке выпуска , охват метода CommonPrefixImplсоставляет 100%, поэтому, вероятно, это связано с оптимизацией компилятора.

13
задан Thomas Levesque 15 August 2012 в 11:24
поделиться