You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:56:07