2009-04-22 9 views
4

編輯:語言/平臺是C#/ .NET懲戒非虛活動(在COM互操作類)

目前,我想要在我當前的項目,以填補一個巨大的單元測試空白,併成爲公認的新到TDD,發現自己非常難以測試如何測試一些更關鍵業務功能。

我拿起了Moq,並有一個簡單的嘲笑,但在我的應用程序的核心是一個相當大的,可怕的COM互操作層,我有一個困難的時間概念如何進行適當的單元測試。 COM組件完全是第三方,因此不能被修改,並且實現了處理電話呼叫的有限狀態機。該組件通過一組非虛擬事件通知我的應用程序,我想按某些命令測試以模擬狀態更改,但Moq不提供任何方法來爲除虛擬事件之外的任何事情執行此操作。

所以我對更有知識的TDDers/Mockists的問題是:你會如何去測試這種事情?

顯然TypeMock支持這個(作爲交換它自己的缺點),但我寧願不將它用於各種類型安全的原因,我的一般感覺是它在我背後做了一些迂迴的事情。

回答

4

您只能模擬虛擬/抽象方法,除非您使用像TypeMock這樣的重型工具。

當你必須測試你無法控制的代碼時,你將不得不打破你對該代碼的依賴。創建具有不可測試類的方法,屬性和事件的外觀。堅持你實際使用的那些;它會保持你寫的代碼的大小。根據您控制的外觀編碼,而不是代碼不符。

最後一件事是使用幾種技術之一來訪問正面,這將允許您在測試過程中替換模擬。你可以使用配置文件,依賴注入框架,懶惰實例化等。這樣你可以嘲笑你的外觀並將其用於單元測試。當然,您仍然需要進行一些集成測試,以確保您的Facade能夠與實際的COM interop類正常工作。

對於一些靈感,看看System.Web.Abstractions。它包含許多包裝ASP.NET核心類的類,使它們可以被嘲弄。

+0

我真的很欣賞這個經過深思熟慮的迴應,但它似乎仍然貫穿着問題的癥結,因爲在COM組件和某個抽象層之間總會有一個無法測試的交互。也許我對TDD理念的理解是根本上有缺陷的...... – TheMissingLINQ 2009-04-22 20:07:26