8

I usually set the attribute [ExcludeFromCodeCoverage] to my Program class, as there are no unit tests for this class possible anyways (or don't make sense either), so it doesn't show up as "missing" in the coverage report:

[ExcludeFromCodeCoverage]
public static class Program
{
    public static void Main(string[] args)
    {
       // do something awesome
    }
}

But with top-level statements I don't know how to handle this. It seems not to be possible to set attributes, as I found here: https://stackoverflow.com/a/69962982/1099519

So far, I stick to the classic Class declaration, but maybe they thought about something else, when it comes to unit test code coverage?

smn.tino
  • 2,272
  • 4
  • 32
  • 41
DominikAmon
  • 892
  • 1
  • 14
  • 26

1 Answers1

17

Since C# 10 the top-level statement generation was changed and now you can add partial Program class to the end of top-level statement (or in separate file) and add attribute to it:

[ExcludeFromCodeCoverage]
public partial class Program { }

Note that in initial feature specification (for C# 9) states that the actual names used by compiler are implementation dependent but since C# 10 and NET 6 using partial class is one of the recommended approaches for unit testing ASP.NET Core apps which use top-level statements.

But personally I would say that if you need such "advanced" scenarios you should switch back to the "plain old" Program classes.

Guru Stron
  • 102,774
  • 10
  • 95
  • 132
  • 2
    That feels awful. What do you do with the other part of the partial that is implied by the use of the `partial` keyword? – Robert Harvey Apr 26 '22 at 11:30
  • @RobertHarvey what "other part"? The one generated by the compiler which contains all the stuff defined in the top-level statement? – Guru Stron Apr 26 '22 at 11:33
  • 1
    Well, maybe I'm just too old, but when I used `partial` on a class, there was always another class in your source code with the same name having the `partial` moniker on it. Otherwise, why bother with `partial`, unless this is just some hacky thing to get around the problem at hand? – Robert Harvey Apr 26 '22 at 11:34
  • @RobertHarvey If you will not add `patial` to the `Program` class this will not compile due to conflict between `Program` class generated by the compiler and the one which was declared by programmer. – Guru Stron Apr 26 '22 at 11:36
  • 3
    The last sentence in your post is good advice. This is a good use case for just using the traditional class declaration. – Robert Harvey Apr 26 '22 at 11:37
  • Is it possible to add it in a separate file instead of the end of Program.cs ? After all the only purpose of "partial" is to allow splitting the declaration of a class in several files. Declaring it in the same file is awkward. – bN_ Jun 12 '23 at 16:58
  • 1
    @bN_ yes, totally. Just declare partial Program class. – Guru Stron Jun 12 '23 at 17:27