2010-11-27 68 views
2

我試圖在一個吐出屬於第三方組件的對象的類上開始使用TDD。但是我變得有點混亂的,顯然:具有TDD的第三方組件

一)單元測試對象應單獨測試

二)第三方組件應該被封裝成一個適配器

做這些規則適用於編寫返回屬於第三方組件的對象實例的代碼測試?作爲一個例子,這裏是迄今爲止測試:

// Arrange 
string foodXml = "<food><ingredient>Cabbages</ingredient>" + 
       "<ingredient>Bananas</ingredient></food>"; 
IFoodMixer mixer = new FoodMixer(); 

// Act 

// Smoothie is the third-party component object 
Smoothie urgh = mixer.Mix(foodXml); 

// Assert 

Assert.AreEquals("Cabbages", urgh.Ingredients[0].Name); 
Assert.AreEquals("Bananas", urgh.Ingredients[1].Name); 

道歉,如果這個問題似乎有點基本(或者,如果上面的概念似乎一點點傻了!) - 我只是努力理解如何在兩個以上規則可以適用在這個情況下。

在此先感謝您提供的任何建議!

回答

4

我會很實際的。如果冰沙僅僅是一個數據對象,不要麻煩包裝它。

FoodMixer裏面有東西在創造思慕雪。如果這是第三方組件,我會把它包裝起來(如果需要,可以從一個類委派給一個靜態方法),然後依賴注入包裝並在你的單元測試中嘲弄它。

然後,您的單元測試將獨立於SmoothieMaker(無論是第三方還是其他方式)描述FoodMixer的行爲和責任。 FoodMixer的一部分責任是要求SmoothieMaker提供冰沙,而不是實際製作冰沙本身。通過嘲笑我們可以表達這種責任和階級範圍。

如果您的冰沙不僅僅是一個數據對象,而且具有豐富的行爲,我也會將它包裹在您的包裝的冰沙製作者中。

現在,您已經完全脫離第三方庫,並且您可以輕鬆進行單元測試,作爲有用的副產品。

+0

感謝您的快速和詳細的反應!問題是Smoothie對象非常複雜,FoodMixer可能會使用其大部分功能(其NPOI btw用於生成Excel文件)。它是否仍然被包裹?感覺它會涉及重寫大部分內容。 – 2010-11-27 15:02:42

+0

在這種情況下,我會制定你想要達到的目標,添加一個包裝來完成這些事情,然後將NPOI放入其中。它不一定是一對一的代表團。你不需要單獨測試包裝器本身,如果它足夠簡單,可以通過檢查進行測試,或者你正在手動測試,並且不會改變(因爲單元測試不是真正關於測試,而是關於如何做容易改變)。 – Lunivore 2010-11-27 16:11:24

-1

看看mockito是一種更簡單的方式來自動創建模擬並驗證斷言而不是使用適配器。 mockito(和JMocks)也有很多很好的教程,它們也是很好的TDD教程。