我正在嘗試爲報告事件日誌中的條目的應用程序編寫單元測試。現在,當我運行單元測試時,我不得不創建一個臨時EventLog,向它寫入條目,並在完成時刪除日誌。我這樣做是因爲我需要找回沒有構造函數的EventLogEntry對象。模擬事件日誌和事件日誌條目
我的問題是是否有嘲諷的事件日誌,以便能夠找回EventLogEntries的任何方式。不得不將條目寫入實際的EventLog看起來更像集成測試,而不是單元測試。
我正在嘗試爲報告事件日誌中的條目的應用程序編寫單元測試。現在,當我運行單元測試時,我不得不創建一個臨時EventLog,向它寫入條目,並在完成時刪除日誌。我這樣做是因爲我需要找回沒有構造函數的EventLogEntry對象。模擬事件日誌和事件日誌條目
我的問題是是否有嘲諷的事件日誌,以便能夠找回EventLogEntries的任何方式。不得不將條目寫入實際的EventLog看起來更像集成測試,而不是單元測試。
你應該是正確的,這是更多的集成測試。然而,你需要問問自己你真的想在這裏測試什麼。如果它真的是一個單元測試,並且您只想測試EventLogEntries的邏輯,那麼您應該像處理任何其他外部依賴一樣處理事件日誌。
TDD已經帶領我走過了隔離和嘲笑很多東西,模擬奇怪的東西,但最終使我從以後的維護噩夢中拯救出來。即文件IO,記錄,跟蹤,等...
我會堅持你的所有CRUD操作的接口邊界背後的事件日誌,並把它當作好像它是數據訪問。如果您無法輕鬆創建帶外EventLogEntries,那麼您甚至可以考慮創建自己的實體,以表示來自事件日誌的條目並使用它們。
這是接口真正有用的地方。你的課是否依靠IEventLog而不是EventLog。然後,在您的測試中,您可以模擬出IEventLog並驗證您期望在IEventLog上調用的方法的確被調用。
如果要插入一個記錄到你的類捕捉一切(class EventLogRecorder : IEventLog
),你也可以這樣做......做任何你需要的。
鬆耦合是要被去這裏...
今天這個類似於另一個問題,我剛纔已經回答 - 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