使用NSubstitute如何对LoggerMessageAttribute进行单元测试?
使用LoggerMessageAttribute后的日志记录验证方案
当你改用LoggerMessageAttribute后,它会为ILogger生成强类型的扩展方法,测试时无需再匹配通用的Log方法,直接验证生成的扩展方法即可,具体步骤如下:
1. 先明确LoggerMessageAttribute的定义示例
首先你会定义一个静态类来声明日志方法,示例如下:
public static class LogMessages { [LoggerMessage( EventId = 100, Level = LogLevel.Warning, Message = "操作异常,关联项:{Item}")] public static void LogOperationWarning(this ILogger logger, string item) { // 方法体由编译器自动生成,无需手动编写 } }
2. 直接验证生成的扩展方法
在测试代码里,直接验证这个强类型扩展方法是否被调用,代码更简洁直观:
// 构造模拟的ILogger实例 var logger = Substitute.For<ILogger>(); // 执行触发日志的业务逻辑 logger.LogOperationWarning("用户ID:123"); // 验证扩展方法被调用1次,且参数匹配 logger.Received(1).LogOperationWarning("用户ID:123");
3. 如需验证底层Log方法的细节(可选)
如果需要验证原始Log方法的参数(比如EventId、日志级别、消息模板等),可以基于LoggerMessageAttribute中定义的固定值做精准匹配:
logger.Received(1).Log( LogLevel.Warning, 100, // 对应LoggerMessage里配置的EventId Arg.Is<It.IsAnyType>(state => // 验证状态对象中的参数值是否符合预期 state.GetType().GetProperty("Item")?.GetValue(state)?.ToString() == "用户ID:123"), null, Arg.Any<Func<It.IsAnyType, Exception?, string>>());
内容的提问来源于stack exchange,提问作者Anna Melashkina
相关产品推荐
相关产品推荐

