В настоящее время я пытаюсь получить следующий код для успешного выполнения во время выполнения:
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>(...)
, который я, очевидно, не настроил.
Читая существующий ответ на эту и документацию по Moq, я пришел к выводу, что мне, вероятно, следует просто смоделировать обобщенный метод с правильным аргументом типа, как показано выше.
Здесь я наткнулся на следующую проблему, которая подводит меня к концу идей:
В текущих версиях Microsoft.Extensions.Logging
FormattedLogValues
уже не общедоступен, а является внутренним (после этого PR ), что делает невозможным насмешку над универсальным методом, который вызывается в конце.
Кто-нибудь успешно решил эту проблему?
Как?