c# - 模拟 NLog 的记录器并读取记录的消息

标签 c# .net .net-core moq nlog

我使用 NLog 4.5.11 进行日志记录,使用 moq 4.10.1 进行模拟。

我有一个中间件,它使用 NLog 将异常详细信息写入日志文件。

我需要在我的 API 项目中对中间件进行单元测试,并检查记录的消息是否有正确的值。

这就是我声明异常记录器的方式:

private static Logger _exceptionLogger = LogManager.GetLogger("ExceptionLogger");

这就是我在中间件构造函数中初始化 Logmanager 的方式:

 LogManager.LoadConfiguration(String.Concat(Directory.GetCurrentDirectory(), "/nlog.config"));

这就是我记录异常消息的方式:

_exceptionLogger.Error(exceptionMessage);

有没有什么方法可以在不实际写入和读取文件中记录的消息的情况下做到这一点?

最佳答案

不模拟记录器,建议使用 Memory target在单元测试中。

例如:

// Arrange
var config = new NLog.Config.LoggingConfiguration();
var memoryTarget = new NLog.Targets.MemoryTarget();
memoryTarget.Layout = "${message}";   // Message format
config.AddRuleForAllLevels(memoryTarget);
LogManager.Configuration = config;

// Act
// Your call

// Assert
var logEvents = target.Logs;
// E.g. contains message in logEvents

PS:请注意,在上面的示例中使用了全局 LogManager,因此您无法并行运行测试。如果您需要并行测试,请创建一个新的 LogFactory并将 LogFactory 或创建的记录器传递给您的类/方法。

关于c# - 模拟 NLog 的记录器并读取记录的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66004805/

相关文章:

c# - Span<T> 是否可以在没有固定表达式的情况下指向固定大小的缓冲区?

c# - 如何在没有不安全关键字的情况下获取结构的 Span<byte> View

c# - DbContextOptionsBuilder 不包含 'UseSqlServer' 的定义

c# - Alpha channel 透明度和调整图像文件大小

C# WinForms : How to set Main function STAThreadAttribute

c# - 公开一个在函数内部创建的对象

c# - 如何使用反射获取特定接口(interface)类型的所有字段

java - 如果我们使用工厂模式,我们是否应该向用户隐藏产品?

c# - 从 T4 模板中的 CodeProperty 检索属性类型

c# - 为什么.NET 框架不提供深度复制对象的方法?