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

标签 c# .net unit-testing moq ilogger

我有一个 Microsoft.Extensions.Logging.ILogger 的扩展方法,它检查给定的日志级别是否启用。然后继续进行实际的日志记录。 当我尝试对该方法进行单元测试时,我发现 logger.IsEnabled(logLevel) 对于单元测试项目中的所有日志级别始终返回 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);
         }
       }
    }

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

[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>(); 之后)。

关于c# - C# 单元测试中未启用 ILogger.LogLevel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71514928/

相关文章:

c# - 配置 asp.net 项目

.net - 缩短 VB.NET 数组声明?

c# - 在 C# 中获取 x 的静态类型?

node.js - 如何 "Fake"测试 Mongoose 模型的日期/时间

c# - UWP 直接从 Windows 应用程序打印而不带打印对话框

java - 如何获取 IBM Websphere Queue 上的消息计数

python - Tkinter 的 event_generate 命令被忽略

java - 模拟抽象类并使用 Mockito 注释注入(inject)类?

c# - 如何暂时停用 MSBuild.ILMerge.Task?

c# - 标记 DataTable 中的非唯一行