Bra*_*rar 5 logging unit-testing moq mocking .net-core
我目前正在尝试使以下代码在运行时成功:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,MockException我在运行测试时得到了一个,因为被调用的方法是ILogger.Log<FormattedLogValues>(...)我显然没有设置的泛型。
阅读对此的现有答案和 Moq 文档,我得出的结论是,我可能应该使用正确的类型参数模拟泛型方法,如上所示。
在这里,我偶然发现了下一个问题,这使我结束了想法:
在当前版本中,Microsoft.Extensions.Logging FormattedLogValues不再是公开的而是内部的(在这个 PR 之后),这使得模拟最终被调用的泛型方法变得不可能。
有没有人成功解决过这个问题?如何?
我有一个类似的问题。我只想验证是否调用了 LogInformation。根据这个-> https://github.com/aspnet/Extensions/issues/1319它可能应该由 Moq 解决..
但是,最后有建议您可以使用 It.IsAnyType 而不是 object.. 对于您来说,这将类似于:
_mockLogger.Setup(logger => logger.Log(
It.IsAny<LogLevel>(),
It.IsAny<EventId>(),
It.IsAny<It.IsAnyType>(),
It.IsAny<Exception>(),
(Func<It.IsAnyType, Exception, string>) It.IsAny<object>()))
.Callback(logCallback);
Run Code Online (Sandbox Code Playgroud)
我没能让它发挥作用,但这也许会把你推向正确的方向?
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |