2011-01-22 182 views
4

爲什麼Moq Verify失敗並帶有「Moq.MockException:調用未在模擬上執行」?用Moq嘲笑TraceListener

var mock = new Mock<TraceListener>(); 
var ts = new TraceSource("traceSourceName", SourceLevels.Verbose); 
ts.Listeners.Add(mock.Object); 

var message = "the message"; 

ts.TraceEvent(TraceEventType.Verbose, 0, message); 
ts.Flush(); 
mock.Verify(x => x.WriteLine(message)); 
+0

+1好的標題! – abel 2011-01-22 18:45:11

回答

0

該測試指出WriteLine方法必須被調用,但它不是。查看代碼很可能是因爲此測試已經在您的TraceSource.TraceEventTraceSource.Flush方法中暴露了一個錯誤。仔細檢查這些方法,你應該很好去!請參閱this question

+0

如果我使用僞造,則調用WriteLine方法。 – Lybecker 2011-02-27 06:42:36

+0

一個假的是什麼?你用假來代表什麼?發佈我的答案中提到的兩個metod,也許我們可以看到一些。 – vidstige 2011-02-27 15:59:19

4

我知道這個問題已經在這裏很長一段時間,不過答案如下...

當您通過TraceSource編寫跟蹤事件調用您的跟蹤偵聽TraceEvent方法做跟蹤 - 讓你需要驗證呼叫listener.TraceEvent,不listener.WriteLine ...

var mock = new Mock<TraceListener>(); 
var ts = new TraceSource("traceSourceName", SourceLevels.Verbose); 
ts.Listeners.Add(mock.Object); 

var message = "the message"; 

ts.TraceEvent(TraceEventType.Verbose, 0, message); 

mock.Verify(x => x.TraceEvent(It.IsAny<TraceEventCache>(), "traceSourceName", 
    TraceEventType.Verbose, 0, message), Times.Once(), "Expected a trace"); 

希望這可以幫助別人!

乾杯,

摩根