Unit Testing Internal Classes in C#
I recently added a whole bunch of tests to EasyLogger, if you are wondering what EasyLogger is then take a look HERE to find out why I built it. I wanted to have at least 80% coverage and that meant having to write tests for the Log4NetLogger.cs class which happens to be internal:
internal sealed class Log4NetLogger : ILogger
{
private readonly ILog _logger;
[DebuggerStepThrough]
internal Log4NetLogger(ILog logger)
{
_logger = logger;
}
[DebuggerStepThrough]
public void Debug(object message)
{
_logger.Debug(message);
}
...
}
This meant that in my test method I could not do:
Mock<ILog> mockedLogger = new();
Log4NetLogger logger = new(mockedLogger.Object);
I intentionally defined this class as an internal because I did not want the user to be able to create an instance of this outside the context of the Log4netService but now how would I test it? hmm….
I could just write an integration or even an end-to-end test to make sure I meet the coverage requirement and call it a day but it just didn’t feel right; I still wanted to have unit tests for the class. So after a few minutes of talking to uncle google I found…
InternalsVisibleToAttribute
As MSDN explains:
Specifies that types that are ordinarily visible only within the current assembly are visible to a specified assembly.
After putting this guy inside the AssemblyInfo.cs, the internal class became visible to the EasyLogger.Tests.Unit assembly which meant I managed to unit test an internal class in C# for first time! Happy Days! :-)