Как смоделировать ILogger / ILoggerService, используя Moq - PullRequest
7 голосов
/ 20 марта 2012

Я пишу несколько юнит-тестов для своего класса View Model. Конструктор этого класса внедряется с помощью ILoggerService. Этот интерфейс определяет 1 метод GetLog, который возвращает ILogger. Пример ниже: this представляет класс, который реализует ILoggable: -

protected ViewModelBase(ILoggerService loggerService)
    {
        Logger = loggerService.GetLog(this);
    }

Я пытаюсь протестировать мой метод CreateNewOrder, который выглядит следующим образом:

private void CreateNewOrder(INewOrderViewModel newOrderViewModel)
    {
        Logger.Log("Sending Create New Order Message", LogCategory.Info);
        var createNewOrderMessage = new OrderMessage(newOrderViewModel);
        _eventAggregator.GetEvent<CreateOrderEvent>().Publish(createNewOrderMessage);
    }

Как бы я поэкспериментировал с ILoggerService, чтобы возвращался действительный Logger? В настоящий момент мой юнит-тест создает исключение NullReferenceExeception.

Я использую Moq, чтобы издеваться.

Я представляю, что мне нужно сделать что-то вроде

var loggerService = new Mock<ILoggerService>();
        loggerService.Setup(svc => svc.GetLog(??))

Но я не могу понять, как заставить мой тестовый класс реализовать ILoggable.

Заранее спасибо.

1 Ответ

9 голосов
/ 20 марта 2012

Я не уверен, какой тип имеет параметр метода GetLog, но я предполагаю, что это что-то вроде object, поэтому служба ведения журнала может определить тип, запрашивающий регистратор. Вы можете использовать It для макетирования параметров в методе, который вы настраиваете, как показано ниже.

var logger = new Mock<ILogger>();

var loggerService = new Mock<ILoggerService>();
loggerService.Setup(c => c.GetLog(It.IsAny<object>())
     .Returns(logger.Object);

Затем передайте logger.Object любому методу или типу, которому требуется ILoggerService.

...