How to decorate a class as untestable for Code Coverage?
Asked Answered
S

4

25

Background: Visual Studio 2008, C#, .Net 3.5.

I have a number of utility classes that are simply not unit-testable. This is mainly because they interact with resources (e.g. databases, files etc).

Is there a way I can decorate these classes so that the Visual Studio Code Coverage engine will ignore them, so not decreasing the code coverage percentage?

Shores answered 21/10, 2009 at 19:0 Comment(1)
Dupe: #1289929Tver
S
23

There is an answer in this article about how to use [System.Diagnostics.DebuggerHidden] or [System.Diagnostics.DebuggerNonUserCode] Attributes to exclude methods from code coverage.

Update as per David's comment:

As of .NET 4.0 there is a dedicated attribute for this: [ExcludeFromCodeCoverage]

Simp answered 21/10, 2009 at 19:53 Comment(3)
A point of caution (from the above article) - "DebuggerHidden will prevent you from stepping into the method or setting breakpoints in that code and DebuggerNonUserCode will hide the code as (sic) debug time and automatically step over it."Thromboembolism
Important note: As of .NET 4.0 there is a dedicated attribute for this: [ExcludeFromCodeCoverage]Gavotte
Thanks @Gavotte your note has been added to the answer.Simp
N
30

When you upgrade your project to .NET 4, you'll get the ExcludeFromCodeCoverageAttribute Class.

Necrophilism answered 6/6, 2010 at 14:41 Comment(1)
Great for very obvious extension methods.Uraninite
S
23

There is an answer in this article about how to use [System.Diagnostics.DebuggerHidden] or [System.Diagnostics.DebuggerNonUserCode] Attributes to exclude methods from code coverage.

Update as per David's comment:

As of .NET 4.0 there is a dedicated attribute for this: [ExcludeFromCodeCoverage]

Simp answered 21/10, 2009 at 19:53 Comment(3)
A point of caution (from the above article) - "DebuggerHidden will prevent you from stepping into the method or setting breakpoints in that code and DebuggerNonUserCode will hide the code as (sic) debug time and automatically step over it."Thromboembolism
Important note: As of .NET 4.0 there is a dedicated attribute for this: [ExcludeFromCodeCoverage]Gavotte
Thanks @Gavotte your note has been added to the answer.Simp
S
0

One of the reason you want to write unit-tests is to make your code loosely coupled. You can read this article if you're interested in learning how to write loosely coupled code (in case you don't know how).

Saying that you can try to use tools like TypeMock that can help you mock your objects even if you don't write them using Dependency Injection principle.

TypeMock was the first Mock Framework I used. I switch to Rhino Mocks because with TypeMock I didn't have to be discipline enough to write loosely coupled code.

Sideburns answered 21/10, 2009 at 19:30 Comment(2)
We write very good, loosely coupled code; but at some point, something has to actually access a resource!Shores
You create wrappers for these resources and use wrappers in your production code instead of resources itself. Check the link in my answer.Sideburns
C
0

I imagine there is more than one class in your test project and so an option to consider would be to directly exclude the test project from coverage. You can achieve that by adding this code in your ClassTests.csproj :

<ItemGroup>
        <AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute" />
</ItemGroup>
Crwth answered 24/8, 2022 at 9:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.