首页 > 解决方案 > 如何通过 Moq 在 .NetCore Unit Tesing 中验证 ILogger?

问题描述

我正在尝试通过 Moq 在我的项目(.net core 3.1)中测试 ILogger(Microsoft.Extensions.Logging),但是......它失败了......我试图在我的代码中捕获一个异常:

  try{
      //do something
     }
    catch (Exception e)
            {
                _logger.LogError(new
                {
                    RequestId = requestId.ToString(),
                    Topic = "Merge files",
                    Message = "process failed",
                    Status = "Failed"
                }, e);
            }

我定义了模拟记录器

private readonly Mock<ILogger<MyClass>> _logger = new Mock<ILogger<MyClass>>();

这是我的 UT

_logger.Verify(
                x => x.Log(
                    It.IsAny<LogLevel>(),
                    It.IsAny<EventId>(),
                    It.Is<It.IsAnyType>((v, t) => true),
                    It.IsAny<Exception>(),
                    It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)), Times.Once);

我对其进行了调试,在我的代码中执行了日志异常方法,但最后 UT 失败,因为我收到以下消息:

预期在模拟上调用一次,但为 0 次:x => x.Log<It.IsAnyType>(It.IsAny(), It.IsAny(), It.Is<It.IsAnyType>((v, t) => True), It.IsAny(), It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => True))

标签: c#moq

解决方案


我对此进行了深入研究。

在我的项目中,我的 LogError() 方法调用 Microsoft.Extensions.Logging 中的另一个 Define() 方法来执行日志操作。

通过这种方法逻辑,我必须先模拟 logger.IsEnabled(logLevel) 。

_logger.Setup(x => x.IsEnabled(It.IsAny<LogLevel>())).Returns(true);

在此处输入图像描述


推荐阅读