Подозирам, че отговорът е не, но все пак ще попитам...
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