Search code examples
c#unit-testingauto-generatencover

ExcludeFromCodeCoverage Exclude Auto-Generated Code


Is there a way to mark an auto-generated class as ExcludeFromCodeCoverage. I am using that attribute in other areas and works great. But if you open the code of the auto-generated guy and mark the classes as ExcludeFromCodeCoverage, once you re-generate that class itll be over written.

I can create partial classes in the code behind of the dbml and apply that attribute to it and it works, however, that would make for a lot of partial classes.


Solution

  • You can use PostSharp or other AOP framework to create aspect which will apply ExcludeFromCodeCoverageAttribute to specified types or namespaces:

    [Serializable]
    [AttributeUsage(AttributeTargets.Assembly)]
    [MulticastAttributeUsage(MulticastTargets.Class | MulticastTargets.Struct)]
    [ProvideAspectRole(StandardRoles.PerformanceInstrumentation)]
    public sealed class DisableCoverageAttribute : TypeLevelAspect, IAspectProvider
    {
        public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
        {
            Type disabledType = (Type)targetElement;
    
            var introducedExclusion = new CustomAttributeIntroductionAspect(
                  new ObjectConstruction(typeof (ExcludeFromCodeCoverageAttribute)));
    
            return new[] {new AspectInstance(disabledType, introducedExclusion)};
        }
    }
    

    Then just apply this aspect to assembly and provide namespace which you want to exclude. During compilation PostSharp will add ExcludeFromCodeCoverageAttribute to all classes in My.AutogeneratedCode namespace:

    [assembly: DisableCoverage(AttributeTargetTypes="My.AutogeneratedCode.*")]
    

    Sample code and explanations you can find here.