2011-09-05 79 views
2

我有超過十年的舊代碼,我必須寫單元測試以下邏輯。這是一個具體的類,下面的邏輯在於ctor。有沒有一種好的方法來編寫這種遺留代碼的單元測試/模擬。我正在使用MSTest/RhinoMocks框架和VS 2010 IDE與.Net框架4.0C# - 單元測試/嘲弄 - 遺留代碼

public class SomeClass 
    { 
     /// ctor 
     public SomeClass(XmlNode node) 
     { 
      //Step 1: Initialise some private variable based on attributes values from the node 

      //Step 2: Lot of If , else -if statements ---> something like - 

      if (/*attributeValue is something*/) 
      { 
       // Connect to Db, fetch some value based on the attribute value. 
       // Again the logic of connecting and fetching is in another concrete class 
      } 
      else if (/*attributeValue is somthing else*/) 
      { 
       // fetch a value by loading a config file (this loading and reading of config file 
       // is again a singleton class where config file path is hardcoded) 
      } 
      else 
      { 
       // set some private member variable 
      } 
     } 
    } 
+0

如果您無法重構可測試性,您可以查看類似於TypeMock Isolator的產品。它會花費你$ $$$,但... –

回答

6

單元測試遺留代碼是棘手的。一般來說,你必須首先重構才能編寫單元測試。你最好的選擇是非常小的重構步驟,一個接一個地提高測試性,同時讓測試中的課程處於「工作」狀態。我建議:

1.)引入「感知」變量,使您可以驗證關鍵位置(即DB調用之前和之後)下待測試類的內部狀態。這將允許您編寫測試來驗證課程的當前行爲(基於公共感知變量),而無需進行非常多的重構。根據這些測試驗證類的行爲並開始重構。感應變量是暫時的,一旦完成重構就應該刪除。他們只能在那裏寫測試,所以你可以安全地重構。

2.)逐個將具體類的引用替換爲通過構造函數傳遞的接口引用。對於單例你有兩個選擇,一個是讓Singleton返回一個特殊的單元測試實例 - 這需要修改Singleton實現,但是保持你的類不變。你可以這樣做,直到你可以重構使用接口依賴來替換單例。

此外,我會建議拿起Working Effectively with Legacy Code副本,其中描述了這一步一步重構,特別是詳細的依賴打破技術。

+0

+1的感應變量。我已經通過一個構造函數注入了日誌記錄界面來實現這個好的結果,爲了測試將使用一個簡單的內存記錄器,你可以斷言。 –

+0

問題是,如果您先重構,則無法確定是否提供了與原始代碼相同的功能。恕我直言,先測試然後重構,儘管這可能非常困難 - 有時甚至是不可能的。 – Morten

1

除了BrokenGlass所說的之外,您可能還想考慮編寫一些集成測試以確保整個過程正常工作。例如,如果您的應用程序更新數據庫中的某些行,請編寫針對測試數據庫的可重複測試,這樣您可以在重構時繼續確保正確的功能,並將整個事件分解爲鬆散耦合的可測試塊。

沒有什麼比重構一個類,爲它編寫一堆測試,然後意識到你的重構在應用程序中破壞了別的東西更糟。