我正在尝试编译时日志记录源生成,我想检查我的单元测试是否发送了一些日志消息。我正在尝试在 Moq ILogger 模拟中使用验证,但它没有按预期工作。是否可以?我做错了什么?
我正在尝试这样验证:
_loggerMock.Verify(x => x.Log(
LogLevel.Warning,
It.IsAny<EventId>(),
It.IsAny<It.IsAnyType>(),
It.IsAny<Exception>(),
It.IsAny<Func<It.IsAnyType, Exception, string>>()), Times.Once);
我的代码调用此 ILogger 扩展:
[LoggerMessage(LogLevel.Warning, "OptinUsageService - Anomaly: optin {Id} is already available")]
internal static partial void LogOptinAlreadyAvailableAnomaly(this ILogger logger,
string id);
你走在正确的道路上:-)
对 ILogger 的模拟应该是模拟类而不是通用记录器。
[Fact]
public void CreateOrder_ShouldLogOrderCreated()
{
// Arrange
var mockLogger = new Mock<ILogger<OrderService>>();
var service = new OrderService(mockLogger.Object);
int testOrderId = 123;
// Act
service.CreateOrder(testOrderId);
// Assert
mockLogger.Verify(
logger => logger.Log(
It.Is<LogLevel>(level => level == LogLevel.Information),
It.Is<EventId>(id => id.Id == 1000),
It.Is<It.IsAnyType>((v, t) => v.ToString() == $"Order {testOrderId} was successfully created."),
It.IsAny<Exception>(),
It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)),
Times.Once
);
}
看,使用你的类,说 OrderService 然后触发它。
或者,您可以登录到缓冲区的文本文件并从中读取文本,这将是一个集成测试,但也可以工作