Как издеваться над Microsoft.Extensions.Logging используя Moq - PullRequest
1 голос
/ 16 марта 2019

В настоящее время я пытаюсь получить следующий код для успешного выполнения во время выполнения:

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 ), что делает невозможным насмешку над универсальным методом, который вызывается в конце.

Кто-нибудь успешно решил эту проблему? Как?

...