2012-01-27 107 views
16

使用Microsoft Test Framework和Moq我試圖驗證是否調用了log4net方法。設置moq並驗證是否調用了方法

[TestMethod()] 
    public void Log_Info_When_Stuff_Is_Done() 
    { 
     SampleClass sampleObject = new SampleClass(); 

     Mock<log4net.ILog> logMockObject = new Mock<log4net.ILog>(); 

     sampleObject.Log = logMockObject.Object; 

     sampleObject.DoStuffAndLogInfo(); 

     logMockObject.Verify(moqLog => moqLog.Info("do stuff got called"), Times.AtLeastOnce()); 

    } 

我得到驗證調用異常說

在模擬的預期調用至少一次,但從來沒有 執行:moqLog => moqLog.Info(「做的東西得到了所謂的」 )沒有安裝 配置。沒有執行調用。

我在做什麼錯?

更新問題出在SampleClas.Log屬性的getter上。即使該屬性已經設置爲ILogProxy,我也總是返回LogManager.GetLogger(...);。我的印象是,該物業的get訪問者不會被稱爲,因爲我已經設置了這樣的代理sampleObject.Log = logMockObject.Object;

+0

是「做的東西得到了所謂的」完全匹配的字符串傳遞給.INFO? – 2012-01-27 21:09:52

+1

'sampleObject.DoStuffAndLogInfo()'做了什麼? – 2012-01-27 21:10:43

+0

不是。參數是否重要?我認爲只要你傳遞了一些信息,參數就不重要了。 – 2012-01-27 21:10:58

回答

1

該測試已正確設置。

檢查您的sut以查看Log.Info是否實際上在DoStuffAndLogInfo方法內調用。

+0

我同意這個答案。爲了給自己一些想法,使用我的SampleClass運行相同的測試,您將看到測試成功。 'public class SampleClass {public void Log(ILog log){log.Warn(「do something got called」); }}' – 2012-01-27 21:17:26

+0

@JohnRuiz正確,我也使用過這樣的類 - 只有它是'Info'而不是'Warn' – GolfWolf 2012-01-27 21:22:00

+0

有意義。我做了這個改變,但我也不得不做出另一個改變。請參閱我的問題更新。 – 2012-01-27 21:28:58

32

現在Moq正在驗證DoStuffAndLogInfo調用Info確切的字符串「做的東西被調用」。如果它的實際調用Info用不同的參數,和你不關心實際的參數是什麼,請使用以下代替:

logMockObject.Verify(moqLog => moqLog.Info(It.IsAny<string>()), Times.AtLeastOnce()); 
+0

有道理。我做了這個改變,但我也不得不做出另一個改變。請參閱我的問題更新。 – 2012-01-27 21:28:40

+0

您爲日誌創建了一個模擬,但不是'SampleClass'。如果'SampleClass.DoStuffAndLogInfo'訪問'this.Log',它仍然會調用''''''''SampleClass.Log'的訪問器。 – 2012-01-27 21:36:51

相關問題