如何使用Moq模拟ILogger / ILoggerService

时间:2012-03-20 11:05:13

标签: c# unit-testing prism moq moq-3

我正在为View Model类编写一些单元测试。该类的构造函数注入ILoggerService。该接口定义了一个返回ILogger的方法GetLog。下面的内容 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);
    }

我如何进行Mocking ILoggerService以便返回有效的Logger?目前我的Unit测试会抛出一个NullReferenceExeception。

我正在使用Moq做我的嘲笑。

我想我需要按照

的方式做点什么
var loggerService = new Mock<ILoggerService>();
        loggerService.Setup(svc => svc.GetLog(??))

但是如果不让我的测试类实现ILoggable,我就无法看到。

提前致谢。

1 个答案:

答案 0 :(得分:9)

我不确定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的任何方法或类型。