如何使用Moq模拟ILogger / ILoggerService

我正在为View Model类编写一些unit testing。 该类的构造函数注入ILoggerService。 该接口定义了一个返回ILogger的方法GetLog。 类似下面的东西, 代表一个实现ILoggable的类: –

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

我正在尝试unit testing我的CreateNewOrder方法,如下所示:

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

我将如何模拟ILoggerService以便返回有效的Logger? 目前我的Unit测试抛出NullReferenceExeception。

我正在用Moq做我的嘲笑。

我想象我需要做一些事情

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

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

提前致谢。

我不确定GetLog方法参数的类型是什么,但我认为它类似于object因此记录器服务可以确定请求记录器的类型。 您可以使用It来模拟正在设置的方法中的参数,如下所示。

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

然后将logger.Object传递给任何需要ILoggerService方法或类型。