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

ASP.NET Core中使用ILogger进行单元测试:如何验证日志中的objectId参数

如何验证ASP.NET Core日志中MyMetric的ObjectId值?

你现在的测试已经能覆盖日志级别、事件ID和消息的验证,但要检查附带的MyMetric对象里的ObjectId,只需要调整It.Is<It.IsAnyType>的断言逻辑,直接访问日志状态对象的属性就行。

核心思路是:Log方法的第三个参数v就是你传入的MyMetric实例,我们可以先做类型检查,再验证它的ObjectId是否符合预期。

修改后的完整测试代码如下:

public class MyLoggerTest { 
    [Fact] 
    void ShouldLog() { 
        var loggerMock = new Mock<ILogger<MyLogger>>(); 
        var metricsLogger = new MyLogger(loggerMock.Object); 
        var expectedObjectId = 234;
        
        metricsLogger.DoLog(expectedObjectId);

        loggerMock.Verify( 
            x => x.Log( 
                LogLevel.Information, 
                It.Is<EventId>(e => e.Id == 123), 
                It.Is<It.IsAnyType>((object v, Type _) => 
                    v is MyMetric metric && metric.ObjectId == expectedObjectId), 
                It.IsAny<Exception>(), 
                It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)
            ), Times.Once); 
    } 
}

关键说明:

  • 把原来依赖v.ToString()的验证逻辑,替换成了更可靠的类型检查+属性验证:先确认v是MyMetric实例,再直接验证它的ObjectId等于我们传入的234。
  • 如果还想保留对日志消息文本的验证,可以把两个条件结合起来:
    It.Is<It.IsAnyType>((object v, Type _) => 
        v is MyMetric metric && 
        metric.ObjectId == expectedObjectId &&
        v.ToString().Contains("Logging stuff")
    )
    

这种方式的优势在于,直接针对业务对象的属性做验证,不会因为ToString()方法的实现变更而导致测试失效,是更稳定的验证方式。

内容的提问来源于stack exchange,提问作者avj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:32:48