在.Net中使用编译时日志记录时如何在Moq ILogger Mock中调用Verify?

问题描述 投票:0回答:1

我正在尝试编译时日志记录源生成,我想检查我的单元测试是否发送了一些日志消息。我正在尝试在 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);
c# asp.net .net moq open-telemetry
1个回答
0
投票

你走在正确的道路上:-)

对 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 然后触发它。

或者,您可以登录到缓冲区的文本文件并从中读取文本,这将是一个集成测试,但也可以工作

© www.soinside.com 2019 - 2024. All rights reserved.