Extends Verify to allow verification of MicrosoftLogging bits.
See Milestones for release notes.
Entity Framework Extensions is a major sponsor and is proud to contribute to the development this project.
[ModuleInitializer]
public static void Initialize() =>
VerifyMicrosoftLogging.Initialize();Logging Recording allows, when a method is being tested, for any logging made as part of that method call to be recorded and verified.
Call LoggerRecording.Start(); to get an instance of the LoggerProvider. LoggerProvider implements both ILogger and ILoggerProvider.
Then pass in the LoggerProvider instance to a class/method that write log entries:
[Fact]
public Task Logging()
{
Recording.Start();
var logger = new RecordingLogger();
var target = new ClassThatUsesLogging(logger);
var result = target.Method();
return Verify(result);
}
class ClassThatUsesLogging(ILogger logger)
{
public string Method()
{
logger.LogWarning("The log entry");
using (logger.BeginScope("The scope"))
{
logger.LogWarning("Entry in scope");
}
return "result";
}
}Results in:
{
target: result,
log: [
{
Warning: The log entry
},
{
Message: StartScope,
State: The scope
},
{
Warning: Entry in scope
},
{
Message: EndScope
}
]
}A common pattern is to use a type logger (Logger<T>). LoggerProvider provides a builder method CreateLogger<T> to construct a Logger<T>:
[Fact]
public Task LoggingTyped()
{
Recording.Start();
var logger = RecordingProvider.CreateLogger<ClassThatUsesTypedLogging>();
var target = new ClassThatUsesTypedLogging(logger);
var result = target.Method();
return Verify(result);
}
class ClassThatUsesTypedLogging(ILogger<ClassThatUsesTypedLogging> logger)
{
public string Method()
{
logger.LogWarning("The log entry");
return "result";
}
}Results in:
{
target: result,
log: {
Warning: The log entry,
Category: ClassThatUsesTypedLogging
}
}Log designed by Ben Davis from The Noun Project.
