如果您將邏輯從用戶界面分離出來,則可以使用TDD用戶界面沉重的應用程序。簡而言之,這就是MVC。下面是做這件事的一個概念上的方式表示爲類圖(省略了模型):
+----------------------+ 1
| MyDownloadUI +--------------+
+----------+-----------+ |
| |
| implements |
v |
+----------------------+ | 1
| {interface} |1 1+--------+------------+
| DownloadView +-----+ DownloadController |
+----------------------+ +---------------------+
您需要在用戶界面上做的唯一的事情就是實現DownloadView
接口,並有DownloadController
參考在哪裏它應該發送它的行動。無論何時需要操作UI(更具體地說是視圖),DownloadController應該只有對DownloadView界面的引用。構造函數看起來應該像這樣:
//Sample of MyDownloadUI
DownloadController controller;
public MyDownloadUI {
this.controller = new DownloadController(this);
//...
}
//Sample of DownloadController
DownloadView view;
public DownloadController(DownloadView view) {
this.view = view;
//...
}
通過這種方式,用戶界面可以改變,而控制器擔心視圖的外觀或者什麼的所有標籤和列表的名稱。
這有一個好處,你可以TDD在下載控制器的邏輯,並有一個模擬代替用戶界面。
爲了測試實際的UI,你本身並沒有真正進行單元測試,因爲MyDownloadUI與DownloadController緊密結合(除非你爲DownloadController創建一個接口),它將更多地是一個功能測試。對於像這樣的小型項目,只要您更改UI或將新的連接線連接到控制器,幾乎可以進行手動煙霧測試。當你覺得一個類開始變得太多時,你總是可以選擇將邏輯分解到另一個類(這使得TDD更容易)。你已經給出了例子,例如DownloadTask
,這顯然是一個模特班,所以這是一個好的開始。然後你有FileDownloader
發送DownloadedFile
到FileWriter
。
的DownloadController
,我能想到的最簡單的實現是隻有一個方法:
goDownload(List<string> urls)
的MyDownloadUI當它要開始下載
調用另外一個是:
addUrl(string url)
向下載控制器的內部列表添加一個url
clearUrls()
消除在內部列表
goDownload()
這需要的URL列表,並啓動了「下載過程」
有很多TDD的教程在那裏所有的網址,我最喜歡的是dnrTV視頻與Jean Paul Boodhoo(Part 1,Part 2)。需要付出很多努力,但它在實踐中展示瞭如何去做。
您是否看過在線提供的衆多TDD教程之一? –
我已經看了很多TDD教程中的至少一個,是的......或者你有一個特定的*一個*? :P – Svish