Как смоделировать пользовательский ILoggerManager для выполнения UnitTest - PullRequest
0 голосов
/ 30 мая 2019

Я объявил класс LogManager и интерфейс ILogManager, и у него есть метод LoggerError, этот метод использует ILogger (DI) для входа в систему и выполнения других действий.

Существует класс A (DI ILogClass) и объявляется метод funA() ,, а funA() будет использовать _LogManager.LoggerError("test message").

  • Когда мне проводить модульное тестирование с помощью mock?
  • Как Verify _LogManager.LoggerError("test message")?

Если я просто использую ILogger в классе A, я могу Verify с:

loggerMock.Verify(l => l.Log(LogLevel.Error,It.IsAny<EventId>(),
It.Is<object>(o => o.ToString().Contains("test message")),null,It.IsAny<Func<object, Exception, string>>()), Times.Once);

но не поддерживается с ILogManager макетом.

public class LoggerManager<TCategoryName> : ILoggerManager<TCategoryName>
{
    private readonly ILogger<TCategoryName> _logger;
    public LoggerManager(ILogger<TCategoryName> logger)
    {
        this._logger = logger;
    }
    public void LogError(string message, LoggerErrorType type)
    {
     var errorLogger = NLog.LogManager.GetLogger(loggerName);
     errorLogger.Error(message);
    }
}

class A
{
....DI
     public void Test()
     {
         _loggerManager.LogError("test message")
     }
}


UT:
public void TestUT()
{
    var loggerMock = new Mock ILoggerManager A>>();
    var service = ServiceFactory.Create<A>(loggerMock);

    service.Test();
    //how to Verify logerror message?
}

1 Ответ

0 голосов
/ 30 мая 2019

Ваш LoggerManager<TCategoryName> - это просто оболочка над ILogger<TCategoryName>, и поэтому вы можете просто смоделировать ILogger<TCategoryName> и проверить то же, что вы уже сделали, и это должно работать просто отлично.

Хотя во время выполненияПри фактическом вызове в SUT вам придется вводить зависимости LoggerManager<TCategoryName> соответственно

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