在将 Microsoft.Extensions.Logging.Abstractions 从 Version=2.0.0.0 更新到 Version=3.1.1.0 后,我的一些单元测试失败了。
我有一个 ILogger 被嘲笑为:
var loggerMock = new Mock<ILogger<BillingEventProcessor>>();
loggerMock.Setup(l => l.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.IsAny<IReadOnlyList<KeyValuePair<string, object>>>(),
It.IsAny<Exception>(),
It.IsAny<Func<object, Exception, string>>()));
并且已经进行了验证对 Log() 的调用的单元:
logger.Verify(l => l.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.IsAny<IReadOnlyList<KeyValuePair<string, object>>>(),
It.IsAny<Exception>(),
It.IsAny<Func<object, Exception, string>>())
);
在更新之前,IReadOnlyList<KeyValuePair<string, object>>
类型是 type FormattedLogValues
。
在 v2 中,FormattedLogValues 是一个公共类,但在 v3.1.1 中,FormattedLogValues 是一个内部只读结构。此更改似乎与测试失败有关。
我已经尝试将 It.IsAny 用于第三个参数,而不是 IReadOnlyList 或 FormattedLogValues,但我没有任何运气。
任何人都知道如何更改此测试代码以使测试通过?我可以从调试信息中看到对 Log 方法的调用按预期进行,我只是无法弄清楚如何使用内部只读结构参数正确设置这些模拟。
这是一个 .NET Core 2.2 项目。