2017-04-11 142 views
0

我正在寫一個Downloader(與TDD的樂趣),因爲我有一個方法,其責任是連接到文件。編寫單元測試的方法有網絡連接依賴關係

class FileConnectorHttp : IFileConnector 
{ 
public void ConnectToFile() 
{ 
    //creating a concrete web request here. 
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(UriForTheFileToConnect); 

    //sending HEAD request. 
    webRequest.Method = "HEAD"; 

    //other logic for connection will go here. 
    try 
    { 
    HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse; 

    } 
    catch (ProtocolViolationException e) 
    { 
    throw; 
    } 
    catch (InvalidOperationException e) 
    { 

    throw; 
    } 

} 
} 

我寫了一個測試用於測試連接超時場景。

[Test] 
public void ConnectToSourceFile_ValidUri_Connection_TimeOut_Throws_WebException() 
{ 
    Uri uriForTheFileToDownload = new Uri("https://suppose/this/is/valid/url.txt"); 

    FileConnectorHttp fileConnectorOverHttp = new FileConnectorHttp(uriForTheFileToDownload); 

    Assert.Throws(Is.TypeOf<WebException>(), 

    () => fileConnectorOverHttp.ConnectToFile()); 

} 

所以得到這個例外,我應該關閉我的Wifi連接?什麼應該是測試這種異常的有意義的方法?

+0

看看這個[post](http://stackoverflow.com/questions/11025097/untitesting-moq-method-calling-webrequest)。我認爲它解釋了你想要達到的目標。 – Hintham

+0

一個問題;你爲什麼抓住並立即重新拋出這些例外?您的代碼編寫方式,此處引發的任何異常都將顯示給調用者。所以我不確定是否需要對此進行單元測試 - 如果webRequest.GetResponse中出現WebException異常將會出錯的情況,可以認爲它是公理性的;因爲那不是你控制的代碼,你不需要測試它。 –

+0

您正在使用什麼版本的Visual Studio? – zaitsman

回答

0

您沒有理由測試連接失敗拋出WebException。這不是你的代碼正在做投擲。

OTOH,您可能想要在某些時候測試您的代碼在拋出時正確處理WebException 。要做到這一點,你將不得不包裝或模擬基礎的Web請求。

+0

這種方法不是必需的,你可以使用Fakes或TypeMock。 – zaitsman

+0

包含在我寫的內容中 - 即「模擬」。 – Charlie

0

單元測試理想情況下不應該依賴網絡連接等外部依賴關係。正如上面評論(鏈接)中提到的那樣,你想要模擬這種行爲。否則,使用真正的連接將無法測試故障情況,即以自動方式建立良好的連接和無連接。

單元測試應該遵循FIRST acronym

  • 快速
  • 獨立
  • 重複
  • 自我驗證
  • 及時

如果你需要一個測試,實際使用物理連接,然後你可以編寫集成或系統測試 - 也許使用BDD。

這種方法的好處是您的單元測試套件可以快速運行(自動化),涵蓋許多場景並給予您非常快速的反饋。儘管集成測試可以不經常運行(如果需要),並且您不必太擔心它們需要多長時間,因爲您在此處所做的所有工作都證明了端到端的連接性。

相關問題