When your test project references Microsoft.Extensions.Diagnostics.Testing, this generator creates an AddFakeLogging() extension method that sets up fake logging for testing.
- Automatically generates when
Microsoft.Extensions.Diagnostics.Testingis referenced - Provides access to logged messages for verification
- Uses Microsoft's official testing helpers
Install the Microsoft.Extensions.Diagnostics.Testing package:
dotnet add package Microsoft.Extensions.Diagnostics.Testingusing Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
public class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public void DoWork()
{
_logger.LogInformation("Starting work");
_logger.LogDebug("Debug message");
_logger.LogWarning("Warning message");
}
}
[TestClass]
public class MyServiceTests
{
[TestMethod]
public void Test_WithFakeLogging()
{
AutoMocker mocker = new();
// Use the generated AddFakeLogging extension method
mocker.AddFakeLogging();
var provider = mocker.Get<FakeLoggerProvider>();
MyService service = mocker.CreateInstance<MyService>();
service.DoWork();
// Verify logged messages
var logs = provider.Collector.GetSnapshot();
Assert.IsTrue(logs.Any(log => log.Message == "Starting work"));
Assert.IsTrue(logs.Any(log => log.Message == "Debug message"));
Assert.IsTrue(logs.Any(log => log.Message == "Warning message"));
}
}The generator creates:
public static AutoMocker AddFakeLogging(this AutoMocker mocker)
{
// Sets up FakeLoggerProvider for capturing log messages
// Configures AutoMocker to use fake loggers
}The AddFakeLogging() method:
- Creates a
FakeLoggerProviderinstance - Registers a custom
FakeLoggerResolverwith theAutoMocker - Inserts the resolver after the
CacheResolverin the resolver chain - This ensures all
ILogger<T>instances use the fake logger infrastructure
The FakeLoggerProvider captures all log messages, allowing you to:
- Verify that specific messages were logged
- Check log levels
- Inspect logged data and state
- Validate logging behavior in your tests
[TestMethod]
public void Test_LogLevels()
{
AutoMocker mocker = new();
mocker.AddFakeLogging();
var provider = mocker.Get<FakeLoggerProvider>();
MyService service = mocker.CreateInstance<MyService>();
service.DoWork();
var logs = provider.Collector.GetSnapshot();
// Check for specific log levels
Assert.IsTrue(logs.Any(log => log.Level == LogLevel.Information));
Assert.IsTrue(logs.Any(log => log.Level == LogLevel.Debug));
Assert.IsTrue(logs.Any(log => log.Level == LogLevel.Warning));
}[TestMethod]
public void Test_LoggerFactory()
{
AutoMocker mocker = new();
mocker.AddFakeLogging();
// ILoggerFactory is also available
var factory = mocker.Get<ILoggerFactory>();
var logger = factory.CreateLogger("CustomCategory");
logger.LogInformation("Test message");
var provider = mocker.Get<FakeLoggerProvider>();
var logs = provider.Collector.GetSnapshot();
Assert.IsTrue(logs.Any(log => log.Message == "Test message"));
}You can disable this generator using an MSBuild property in your test project's .csproj file:
<PropertyGroup>
<EnableMoqAutoMockerFakeLoggingGenerator>false</EnableMoqAutoMockerFakeLoggingGenerator>
</PropertyGroup><Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<!-- Disable Fake Logging Extension Generator -->
<EnableMoqAutoMockerFakeLoggingGenerator>false</EnableMoqAutoMockerFakeLoggingGenerator>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Moq.AutoMock" Version="3.5.0" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.Testing" Version="8.0.0" />
</ItemGroup>
</Project>- Verify
Microsoft.Extensions.Diagnostics.Testingis referenced in your test project - Check that the generator is not disabled in your
.csproj - Rebuild the project to trigger generator execution
- Ensure you're using the
Moq.AutoMocknamespace
- Make sure you're calling
AddFakeLogging()before creating your instance - Verify you're getting the
FakeLoggerProviderfrom the sameAutoMockerinstance - Check that your service is actually using the injected logger