2011-01-20 88 views
2

我有以下代碼:C#最佳實踐:引用其他方法的單元測試代碼?

public static String GetHashString(this HashAlgorithm algorithm, Stream inputStream) 
    { 
     if (algorithm == null) 
      throw new ArgumentNullError("algorithm"); 

     if (inputStream == null) 
      throw new ArgumentNullError("inputStream"); 

     Byte[] bytes = algorithm.ComputeHash(inputStream); 

     //Convert the bytes into a hash string 
     String result = ...; 
     return result; 
    } 

我想知道幾件事情:

  1. 望着Microsoft.NET4 HashAlgorithm.ComputeHash(Stream inputStream)方法我可以看到 有一個異常 可能會回來。在這種情況下練習 行Byte[] bytes = algoirthm.ComputeHash(inputStream) 這是一個最好的 與try-catch塊嗎?我問 ,因爲在我看來,如果該 線引發異常,我可以讓 呼叫我的擴展處理錯誤 捕捉。或者,它應該是 try-catch包裹着簡單的 扔。

  2. 此外,在單元測試,我單位 測試所有可能的例外, 包括那些可能來自 其他方法?特別是在這 的情況下...是最佳做法嗎?在這 的情況下,我只需要 預計ObjectDisposeException。 但我想知道 的情況,我打電話的方法可能會拋出 回10個不同的例外。由於我 在這些例外情況下並不真正改變我的輸出 ,我不認爲 有必要單元測試導致相同 結果的所有不同 類型的故障。我想這是否正確?

  3. 最後,我不知道是否是 必要甚至檢查 的inputStream被空,如果 HashAlgorithm.computeHash(Stream inputStream)方法甚至沒有做 如此。

回答

2

記住,您應該測試代碼,而不是.NET框架,

我不會把字節[]字節= algoirthm.ComputeHash(的inputStream)在try-catch塊,代碼誰正在調用你的方法將不得不處理。

當單元測試你可以測試一些用例並確保有效輸入時不會拋出任何異常,並且輸入無效時會拋出例外異常。

我覺得你的代碼是確定,正是因爲.NET拋出異常的InputStream爲null,你正在做這個檢查,如果調用代碼傳遞一個空的inputStream

達維德扔ArgumentNullException

+0

好吧,如果.NET拋出一個異常,如果InputStream爲空,我應該甚至麻煩檢查它?我應該讓.NET拋出異常,而不是我這樣做? – michael 2011-01-20 16:25:29

0

單元測試此方法時,您要確保給定的有效(正確)輸入得到正確(預期)的輸出。你不可能處理所有情況,所以只要處理那些重要且可能發生的情況。您應該優雅地處理無效輸入(例如,當您爲null輸入值拋出異常時)並測試您的方法如何處理無效輸入。

0
  1. 做一個try...catch只,如果你想以某種方式處理異常(即使這意味着拋出一個新的異常 - 但在這種情況下使用innerException參數)。如果在發生異常情況下無法做任何事情,則無需使用它。
  2. 要啓動的百般一些一段代碼可以去錯誤的想法是瘋狂的方式。您必須測試所有可能的成功執行,您應該測試最常見的錯誤,但有時你只是無法測試所有可能的情況。使用你自己的判斷。
  3. 如果它是不可能的.NET方法返回null,我想這是確定沒有測試這種可能性。順便說一下,一些工具(如ReSharper)可以幫助你做出這樣的決定。

關於第3項,你正在做的這種測試是一個先決條件,並且該編程風格被稱爲Design by Contract。有一個新的.NET框架來幫助定義先決條件,後置條件和不變 - 我猜你應該在它看一看:

DevLabs: Code Contracts