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
相关产品推荐
相关产品推荐

