【发布时间】:2019-03-16 16:15:24
【问题描述】:
我目前正在尝试让以下代码在运行时成功:
public delegate void LogDelegate(LogLevel logLevel, EventId eventId, object state, Exception exception, Func<object, Exception, string> formatter);
public abstract class LoggingTestBase
{
private Mock<ILogger> _mockLogger;
public ILogger Setup(LogDelegate logCallback)
{
_mockLogger = new Mock<ILogger>(MockBehavior.Strict);
_mockLogger.Setup(logger => logger.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.IsAny<object>(),
It.IsAny<Exception>(),
It.IsAny<Func<object, Exception, string>>()))
.Callback(logCallback);
return _mockLogger.Object;
}
}
问题是,我在运行测试后得到一个MockException,因为被调用的方法是我显然没有设置的通用ILogger.Log<FormattedLogValues>(...)。
阅读 existing answer to this 和 Moq 文档后,我得出的结论是,我可能应该只使用正确的类型参数模拟泛型方法,如上所示。
在这里我偶然发现了下一个问题,这使我的想法结束了:
在Microsoft.Extensions.Logging 的当前版本中,FormattedLogValues 不再是公共的,而是内部的(在this PR 之后),这使得无法模拟最终调用的通用方法。
有人成功解决了这个问题吗? 怎么样?
【问题讨论】:
标签: unit-testing logging .net-core mocking moq