2017-08-03 115 views
0

我試圖單元測試添加到現有的代碼庫和我在第一障礙幾乎下降通話重構由於該網站是如何構建的。單元測試 - 如何靜態類

給你一些細節,在這個網站每個控制器從名爲SiteController一個基本控制器繼承和控制器的構造函數使用靜態輔助類填充一些數據。

例如

public class HomeController : SiteController 
    { 
     public ActionResult Index() 
     { 
      //Do stuff here 
     }  
    } 

而這裏的基本控制器

public class SiteController 
{ 
    public SiteController() 
    { 
     viewModel = CategoryHelper.GetAllCategories(); 
    } 
} 

和靜態GetAllCategories helper方法

public static class CategoryHelper 
    { 
     public static IList<string> GetAllCategories() 
     { 
      //Go off and get the categories from the WCF layer 
      return _categories; 
     } 
    } 

我不能嘲笑一個靜態的類,但我怎麼能重構這段代碼,以便我可以使用單元測試來處理它。我們已經在整個站點使用了DI,並且我知道這裏的理論 - 我應該將這個靜態類包裝在一個抽象層中,無論如何這對於代碼來說都更好。但是這個我不太確定的實用性。

這也可能是顯而易見的,但我在這裏的目的是爲了保持現場工作(明顯),而且還改寫靜態類或調用它以這樣一種方式,我可以針對它的單元測試。我是新編寫單元測試的,所以我只是在遇到這些問題之前得到滿意的結果,即使是通過一個測試也能看到一個綠色標記!這很令人沮喪,而且當我知道理論解決方案時更是如此,但是不知道該怎麼做才能讓課堂上的問題得到解決。

+0

你可以更具體一點你不確定哪一點?你幾乎完全描述了你需要做的事情,所以我不清楚是什麼讓你沮喪。 –

+1

或者不使用包裝*僅使用靜態類* – BradleyDotNET

+0

實際問題是什麼? 「我如何在單元測試中使用它」是一個不起步的程序。你可以用它來使用它。儘管在很多情況下理想情況下應該避免使用「靜態」,而且通常是過度使用或者錯誤使用,但這本質上並不正確。 *您遇到的*實際問題*是什麼? – David

回答

2
public class HomeController : SiteController 
{ 
    public HomeController(ICategoryHelper categoryHelper) : base(categoryHelper) 
    { 
    } 

    public ActionResult Index() 
    { 
     //Do stuff here 
    }  
} 

public class SiteController 
{ 
    public SiteController(ICategoryHelper categoryHelper) 
    { 
     viewModel = categoryHelper.GetAllCategories(); 
    } 
} 

public class CategoryHelper : ICategoryHelper 
{ 
    public IList<string> GetAllCategories() 
    { 
     //Go off and get the categories from the WCF layer 
     return _categories; 
    } 
} 

public interface ICategoryHelper 
{ 
    IList<string> GetAllCategories(); 
} 

最重要的是對抽象而不是具體的類進行編碼。 CategoryHelper是一個具體的類,你希望你的控制器能夠利用一些執行工作的東西而不關心它是如何完成的。所以你的控制器應該在它們的構造函數中接受一個接口(如果需要,可以將它傳遞給基本控制器)。

同樣,CategoryHelper應該實現一個接口,這基本上是一個合同說:「我可以執行ICategoryHelper的工作。」

然後,線了CategoryHelper,以滿足您的依賴注入的ICategoryHelper依賴。你怎麼做取決於你使用的具體工具(AutoFac,Ninject,SimpleInjector等)。

注:緩存模式可以在這裏更好,如果類不經常改變。

相關問題