2009-12-08 35 views
2

我想創建一個簡單的下載工具。給它一個網址列表,一個目標目錄並打開。然後它會下載這些文件並將它們轉儲到目標目錄中。夠簡單。C#:如何TDD文件下載器

但是,我也想練習TDD。但你如何在這樣的應用程序中執行TDD?我可以看到應用程序的4個主要部分組成:

  • 下載任務(URL +目標名稱,等等)
  • 東西下載文件
  • 東西將文件寫入到磁盤
  • 用戶接口

不能真的TDD用戶界面。下載和寫作很可能由常見的.net類完成。這只是離開下載任務,這是一個愚蠢的容器,並不是TDD非常有趣...

你會如何TDD這樣的應用程序?或者這是一種TDD沒有意義的應用程序?

指針需要。不知道如何或從哪裏開始:p

+0

您是否看過在線提供的衆多TDD教程之一? –

+0

我已經看了很多TDD教程中的至少一個,是的......或者你有一個特定的*一個*? :P – Svish

回答

0

當然,你可以從編寫測試開始:)。

  • 隨着每一個新組件/功能,您 發展問自己這個 功能,該做的,看看你是否 可以檢查一些最終結果。
  • 使用Mocks - 虛擬出外部 相關性(即使用StreamWriter將文件保存到磁盤 )。
  • 當所有的東西失敗,你可以隨時 寫集成測試 - 例如 檢查,當你調用來自特定 地方的文件保存到磁盤上下載一個文件中的類 。
+1

因此,我應該嘗試隱藏一些接口後面的Web和文件系統的東西?並在一些集成測試中測試這些接口的實際實現? – Svish

+0

是的 - 這是測試該問題的一種方法,您還可以檢查最終結果 - 文件實際上已保存。 –

2

你從更明顯的開始。

我想你的用戶界面背後有一個主控制器,其方法看起來像addFilePath()hitGo()。你必須:

  1. 嘲笑互聯網。測試是你想要經常運行的東西。你不希望他們每次都下載這些東西。所以你會嘲笑它返回一個測試文件,它將成爲你的測試套件的一部分。
  2. 致電addFilePath()
  3. 致電hitGo()
  4. 等待你的線程完成他們的工作。
  5. 測試您的整個測試文件已放置在正確的位置(應該是自動清理的臨時位置,您不希望測試會污染您的開發計算機)。
  6. 您也可以測試模擬方法已被正確調用。

在尋找TDD的起點時,您不必非常遠。如果你這樣做,這可能意味着甚至不知道你的應用程序應該做什麼。

隨着第一次寫測試,更多的情況應該呈現給你,讓你寫更多的測試。

4

如果您將邏輯從用戶界面分離出來,則可以使用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發送DownloadedFileFileWriter

DownloadController,我能想到的最簡單的實現是隻有一個方法:

  • goDownload(List<string> urls)的MyDownloadUI當它要開始下載

調用另外一個是:

  • addUrl(string url)向下載控制器的內部列表添加一個url
  • clearUrls()消除在內部列表
  • goDownload()這需要的URL列表,並啓動了「下載過程」

有很多TDD的教程在那裏所有的網址,我最喜歡的是dnrTV視頻與Jean Paul Boodhoo(Part 1,Part 2)。需要付出很多努力,但它在實踐中展示瞭如何去做。

+0

輝煌。將看看這些視頻。現在的東西變得更加清晰了:)(你是怎麼製作出這個令人敬畏的圖表的?手動?) – Svish

+0

@Svish是的,我手工製作了這張類圖。 ASCII藝術不是很棒嗎? :) – Spoike

+0

感謝包括視頻鏈接。將檢查出來! – sivabudh