c# - 模拟 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 目标,而不是模拟记录器。
例如:
// 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 或创建的记录器传递给您的类/方法。
推荐阅读
- javascript - 返回一个数组,其中包含所有 2 的幂的索引
- azure - 不允许 IP 地址为“yyy.yy.yy.yy”的客户端访问服务器。我的客户 ip 是 xxx.xx.xx.xx
- javascript - 将 Search 组件从 App js 重构为 Search js
- css - Tailwind - 有一种样式未在服务器中应用,但在本地应用
- c# - 我在 .NET Core 项目中不断收到“缺少 using 指令或程序集引用”
- python - 如何使用 selenium 将键发送到输入标签?
- javascript - 没有 ID 匹配时,如何显示我的 catch 块消息?
- javascript - 在尝试捕获范围之外初始化的 AWS Lambda 对象抛出 ReferenceError:在初始化之前无法访问“用户”
- haskell - Haskell Wreq - 无法匹配预期类型“GHC.Exts.Item a0”
- dataframe - 绘制带有日期的曲面图