Подозреваю, что нет, но все же спрошу...
TL;DR
Я знаю, что могу исключить класс или метод из анализа покрытия с помощью атрибута [ExcludeFromCodeCoverage]
, но есть ли способ исключить только часть метода?
Конкретный пример
У меня есть метод, который лениво генерирует последовательность из int.MaxValue
элементов:
private static IEnumerable<TElement> GenerateIterator<TElement>(Func<int, TElement> generator)
{
for (int i = 0; i < int.MaxValue; i++)
{
yield return generator(i);
}
}
На практике он никогда не перечисляется полностью, поэтому конец метода никогда не достигается. Из-за этого DotCover считает, что 20% метода не покрыты, и выделяет закрывающую фигурную скобку как непокрытую (что соответствует return false
в сгенерированном методе MoveNext
).
Я мог бы написать тест, который использует всю последовательность, но его выполнение занимает очень много времени, особенно при включенном покрытии.
Поэтому я хотел бы найти способ сообщить DotCover, что самую последнюю инструкцию не нужно закрывать.
Примечание. Я знаю, что на самом деле мне не нужно, чтобы весь код был покрыт модульными тестами; некоторые фрагменты кода не могут или не нуждаются в тестировании, и я обычно исключаю те, у которых есть атрибут [ExcludeFromCodeCoverage]
. Но мне нравится иметь 100% отчет о покрытии кода, который я тестирую, потому что это облегчает обнаружение непроверенных частей кода. Наличие метода с охватом 80%, когда вы знаете, что в нем больше нечего тестировать, довольно раздражает...
int.MaxValue
, когда вы тестируете что-то управляемое, если только это значение не имеет никакого отношения к делу. - person Anthony Pegram   schedule 08.06.2014return Enumerable.Range(0, int.MaxValue).Select(generator);
? РЕДАКТИРОВАТЬ: По сути, вы бы передали ответственность за итерацию/выдачу самой коду LINQ, который не будет учитываться при покрытии кода. - person Chris Sinclair   schedule 08.06.2014exclusiveUpperBound
к методуGenerateIterator
. Публичный методGenerate
, который его вызывает, проходитint.MaxValue
, а тест напрямую вызываетGenerateIterator
(который я сделал внутренним) с другим значением. Я думаю, что это чище, чем изменяемое статическое состояние ... В любом случае, это решает проблему для этого конкретного сценария, но не для общего случая, поэтому вопрос остается открытым;) - person Thomas Levesque   schedule 08.06.2014