2014-09-02 17 views
0

我正在學習編寫mvc控制器的單元測試。然而,在我的一個控制器中,它引用了具體的工廠實例,我們稱它爲'ConcreteFactory',然而,在這種情況下,我不知道如何測試這個控制器,因爲我真的不想擁有工廠類實例返回一個真實/生產實例,我想這不應該是一個很好的單元測試,有沒有一些方法來重構我的代碼,並模擬facotry類返回的實例?如何在ASP.NET MVC控制器或Main()中引用具體工廠類的單元測試類()

廠:

Public Abstract class BaseFactory 
{ 
    public ICalculator GetCalculator(); 
} 

public class ConcreteFactory 
{ 
    public ICalculator GetCalculator(); 
    { 
     return new MyCalculator(); 
    } 
} 

ASP.NET控制器:

Public ViewResult GetResult() 
{ 
    var result=(new ConcreteFactory()).GetCalculator(); 
    return View(result); 
} 

大加讚賞。

+1

您將需要使用依賴注入爲控制器提供'BaseFactory'的具體實現,而不是直接實例化它('New ConcreteFactory()')。這將使您能夠在測試中向控制器提供'BaseFactory'的假實現。 – GolfWolf 2014-09-02 09:33:25

回答

2

您可以測試,但你不會是巧妙地跳過代碼

var result=(new ConcreteFactory()).GetCalculator(); 

要做到這一點,你將不得不使用IoC的依賴注入的實現,然後在測試中使用的嘲弄。

依賴注入,你會由國際奧委會獲取在構造你的對象(這可能是,統一,簡單的噴油器,Ninject等)

所以你的方法是這樣的:

Public ViewResult GetResult() 
{ 
    var result=_concreteFactory.GetCalculator(); 
    return View(result); 
} 

而在你的測試中,你將使用嘲諷(一個好的庫是MoQ)並設置返回值GetCalculator方法。

只是谷歌這個,你會發現很多教程重新嘲笑和依賴注入。

編輯:

我要補充的是單元測試的想法是要測試的只有一件事,因此,我們希望建立的GetCalculator方法的返回值,因爲如果我們不這樣做它可能會因爲工廠而失敗 - 而不是因爲我們想測試的東西無法工作。

+0

如果我們引用兩個ConcreteFactory1和ConcreteFactory2的類,該怎麼辦?所以,根據這個建議,我們必須爲這個控制器添加兩個構造函數。我們正在使用StructureMap作爲IOC Contrainer,但是,我不知道如何在這種情況下爲BaseFactory設置不同的實現。你能幫我嗎? – Pii 2014-09-03 08:50:19

+0

如果我理解你的話,ConcreteFactory1和ConcreteFactory2是完全兩種不同的類型,然後你得到兩個相同的構造函數,但有兩個參數,或者它們只是有不同的實現,然後你需要在你的構造函數中得到一個接口只需使用IoC容器註冊發送你想要的實現。一般來說,使用接口總是很好。 – jony89 2014-09-03 11:41:07