2014-08-27 34 views
1

我是測試新手,正在測試維護中一些遺留代碼的單元測試。控制器是圍繞靜態服務調用來獲取數據的。我不確定最佳路徑,但是我正在考慮將靜態類重構爲實例類,或者深入研究可測試性方法。這個代碼片段是我反覆反覆思考的簡單例子。提前感謝您的任何建議。 staticMedServiceHelper是一個使用WCF ChannelFactory等靜態類的靜態類。順便說一句,如果你有任何良好的WCF/MVC /測試學習資源,請讓我知道。 再次感謝。MVC控制器依賴於靜態服務類 - 可測試性問題

public ActionResult Documents(DocumentsForRequirementViewModel model) 
{ 
     staticMedServiceHelper<IMedService>.Use(proxy => 
     { 
      var requirment = proxy.GetRequirementById(model.Id); 
      var dtos = (IEnumerable<DocumentDTO>)requirement.GetType().GetProperty(model.PropertyName).GetValue(requirement, null); 

      model.Documents = Mapper.Map(dtos, new List<DocumentViewModel>()); 
     }); 

     return PartialView(model); 
} 
+0

我不明白'wcf'在這裏涉及到哪裏;也許有一些誤解? – Codor 2014-08-27 14:37:50

+0

我會投票替換它。拋開靜態課,這件事要求你對任何你想要的東西都進行反思,這是一個巨大的明顯的警告信號,它首先是設計不好的。 – 2014-08-27 14:43:27

+0

staticMedServiceHelper 是利用ChannelFacotry WCF的靜態類。也許這些信息不相關。我的主要問題是關於控制器方法的可測試性。謝謝。 – Jon 2014-08-27 14:44:11

回答

1

我的提示打破依賴很簡單:對於靜態,將它們包裝在實例類中。

假設你有一個靜態的記錄(我真的看到了這一點在生產代碼記住,您)

public static class Logger 
{ 
    public static void Log(string message) 
    { 
    //logging logic here.. 
    } 
} 

public ActionResult Documents(DocumentsForRequirementViewModel model) 
{ 
    Logger.Log("GET action on Documents"); 
    //bla bla 
} 

在這種情況下,依賴是靜態執行記錄的清晰。

我們可以創建一個新的記錄:

public class LogWrapper 
{ 
    public void Log(string message) 
    { 
    Logger.Log(message); 
    } 
} 

和使用,在我們的代碼:

public ActionResult Documents(DocumentsForRequirementViewModel model) 
{ 
    LogWrapper logger = new LogWrapper(); 
    loggerr.Log("GET action on Documents"); 
} 

注:

這只是一個簡單的例子。通常情況下,所有的外部依賴將首先被Interfaced接口,然後爲靜態實現創建一個實例包裝。

如果您有更復雜的依賴關係,您可以創建裝飾器來幫助您完成從靜態到實例的轉換,並將代碼委託給靜態實現。

+0

謝謝亞歷克斯。我希望我能投票回答,但我的名聲太小。非常感謝。 – Jon 2014-08-27 14:54:50

+0

@Jon不用擔心,希望這有助於 – 2014-08-27 14:57:45

+0

但是請注意,只要您在正在測試的類中實例化Logger,就無法獲得任何可測試性。如果您需要任何可測試性,您需要從外部設置記錄器,最好使用構造函數參數(和依賴注入)。 – erikkallen 2014-08-27 15:06:41