2012-03-20 100 views
6

我正在爲我的View Model類編寫一些單元測試。這個類的構造函數注入了一個ILoggerService。這個接口定義了1個返回一個ILogger的方法GetLog。類似下面,其中表示實現ILoggable類: -如何使用Moq模擬ILogger/ILoggerService

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以便返回有效的記錄器?目前我的單元測試拋出一個NullReferenceExeception。

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

我想象我需要做的沿

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

線的東西,但我看不出沒有讓我的測試類實現ILoggable。

在此先感謝。

回答

6

我不確定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

+0

輝煌。這很有用。非常感謝 – user630190 2012-03-20 12:55:58

+0

作爲參考,我使用類似:'var loggerMoq = Mock.Of >();' – Nordes 2018-02-08 03:58:40

相關問題