Как вы тестируете модуль LoggerMessage.Define () в. NET Core 3.1 с Moq? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь провести модульное тестирование некоторых случаев использования LoggerMessage.Define () с использованием библиотеки Moq в xUnit, но не могу понять это. Ниже приведен пример созданной мной функции ведения журнала, а ниже приведен пример модульного теста, который не смог проверить, вызван ли он.

Пример LoggerMessage.Define ():

public static class GlobalExceptionLoggerMessage
{
    public static Action<ILogger, string, Exception> GlobalException = LoggerMessage.Define<string>(
        LogLevel.Error,
        new EventId(StatusCodes.Status500InternalServerError, nameof(GlobalException)),
        "{Message}");

    public static void LogGlobalException(this ILogger logger, string message, Exception exception)
    {
        GlobalException(logger, message, exception);
    }
}

Пример юнит-теста, который я пробовал:

[Fact]
public void LogGlobalExceptionLogTest()
{
    var loggerMock = new Mock<ILogger<object>>();

    var exception = new Exception("Person must exist.");
    const string message = "Person must exist for an object.";

    loggerMock.Object.LogGlobalException(message, exception);

    loggerMock.Verify(
        x => x.Log(
            It.IsAny<LogLevel>(),
            It.IsAny<EventId>(),
            It.Is<It.IsAnyType>((v, t) => true),
            It.IsAny<Exception>(),
            It.Is<Func<It.IsAnyType, Exception, string>>((v, t) => true)));
}

Может кто-нибудь подсказать, как мне это исправить?

Спасибо!

1 Ответ

1 голос
/ 03 апреля 2020

Вам необходимо выполнить некоторые дополнительные настройки. Если вы загляните внутрь метода stati c Define, вы увидите следующее:

if (!logger.IsEnabled(logLevel))
  return;
Log(logger, arg1, exception);

Вы не настроили IsEnabled на своем поддельном регистраторе, поэтому он вернется значение по умолчанию bool (false) и не будет вызывать метод Log.

Принимая ваш пример, если вы добавите следующее:

loggerMock.Setup(x => x.IsEnabled(It.IsAny<LogLevel>())).Returns(true);

... ваш оператор проверки начинает работать.

Рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...