ILogger.LogLevel 在 C# 单元测试中未启用

ILogger.LogLevel is not enabled in C# unit tests

我有一个 Microsoft.Extensions.Logging.ILogger 的扩展方法,它检查给定的日志级别是否启用。然后进行实际的日志记录。 当我尝试对该方法进行单元测试时,我看到 logger.IsEnabled(logLevel) 对于单元测试项目中的所有日志级别总是 returns false,导致我的测试失败。

如果我删除这个 isEnabled 检查,那么我的单元测试就会通过。

尽管如此,在实际项目和单元测试项目的appsettings.json文件中设置了默认日志级别。

我的扩展方法的代码是:

    public static class LoggerExtensions
    {
       public static void LogErrorExt(this ILogger logger, string? message, params object?[] args)
       {
         if (logger.IsEnabled(LogLevel.Error))
         {
           logger.LogError(message, args);
         }
       }
    }

我的单元测试代码 class 是这样的:

[TestClass]
public class ImprovedExtensionsTests
{
  private readonly Mock < ILogger > _logger;
  
  public ImprovedExtensionsTests()
  {
    _logger = new Mock < ILogger > ();
  }

  [TestMethod]
  public void TestOne()
  {
    _logger.Object.LogErrorExt("Testing ", 12);
    
    _logger.Verify(x => x.Log(
      LogLevel.Error,
      It.IsAny < EventId > (),
      It.IsAny < It.IsAnyType > (),
      It.IsAny < Exception > (),
      (Func < It.IsAnyType, Exception, string > ) It.IsAny < object > ()), Times.Once);
  }
}

如何在单元测试项目中设置日志级别并在 运行 测试时启用它们?

您必须为您的 ILogger 模拟创建必要的设置,例如:

_logger.Setup(m => m.IsEnabled(LogLevel.Error)).Returns(true);

在调用 LogErrorExt 之前(例如直接在 _logger = new Mock<ILogger>(); 之后)。