2010-07-30 117 views
4

我正在嘗試爲報告事件日誌中的條目的應用程序編寫單元測試。現在,當我運行單元測試時,我不得不創建一個臨時EventLog,向它寫入條目,並在完成時刪除日誌。我這樣做是因爲我需要找回沒有構造函數的EventLogEntry對象。模擬事件日誌和事件日誌條目

我的問題是是否有嘲諷的事件日誌,以便能夠找回EventLogEntries的任何方式。不得不將條目寫入實際的EventLog看起來更像集成測試,而不是單元測試。

回答

1

你應該是正確的,這是更多的集成測試。然而,你需要問問自己你真的想在這裏測試什麼。如果它真的是一個單元測試,並且您只想測試EventLogEntries的邏輯,那麼您應該像處理任何其他外部依賴一樣處理事件日誌。

TDD已經帶領我走過了隔離和嘲笑很多東西,模擬奇怪的東西,但最終使我從以後的維護噩夢中拯救出來。即文件IO,記錄,跟蹤,等...

我會堅持你的所有CRUD操作的接口邊界背後的事件日誌,並把它當作好像它是數據訪問。如果您無法輕鬆創建帶外EventLogEntries,那麼您甚至可以考慮創建自己的實體,以表示來自事件日誌的條目並使用它們。

1

這是接口真正有用的地方。你的課是否依靠IEventLog而不是EventLog。然後,在您的測試中,您可以模擬出IEventLog並驗證您期望在IEventLog上調用的方法的確被調用。

如果要插入一個記錄到你的類捕捉一切(class EventLogRecorder : IEventLog),你也可以這樣做......做任何你需要的。

鬆耦合是要被去這裏...

3

今天這個類似於另一個問題,我剛纔已經回答 - How do I unit-test saving file to the disk?

唯一的區別是 - 你的依賴是在事件日誌和相關類。讓我們假設你只需要記錄一些嚴重性的文本。

struct Event 
{ 
    public string Description {get; set;} 
    public Severity Severity {get; set;} 
} 

interface Logger 
{ 
    void WriteEvent(Event e); 
    void IEnumerable<Event> GetEvents(); 
} 

現在既然事件日誌是,你不能強迫一個記錄器接口的.NET類,你需要一個適配器

public EventLogAdapter : Logger { 
//delegates to .Net framework's EventLog 
// Also EventLogEntry is internal to this class - entries will be mapped to Event structs 
} 

現在我們需要的是測試...容易,因爲UIA或123

  • 依賴Logger的類的單元測試將使用模擬。
  • 寫集成測試以驗證是否EventLogAdapter的API實際上是從Windows事件日誌
  • 寫寫的東西,至少讀取一個驗收測試驗證的端到端的方案引起了一些記錄,即驗證一個EventLogAdapter已插正確。