2011-04-24 53 views
5

我有一個下面顯示的抽象類,它被所有其他控制器繼承。有沒有可能測試這種方法呢?順便說一句,我試圖使用起訂量,但沒有運氣。如果你能幫助我將非常感激:ASP.NET MVC - 單元測試覆蓋初始化方法

public abstract class ApplicationController : Controller 
{ 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     //do some stuff here 
    } 
} 

回答

4

如果你看看基地的源代碼初始化方法,你會發現,它的作用是,它建立了ControllerContext和URL的東西。現在,下載MvcContrib TestHelper並檢查出TestControllerBuilder。構建者設置您需要的所有內容,以便擁有您所依賴的控制器上下文和其他內容。 好吧,我們還沒有結束 - 你想測試你自己的初始化權的覆蓋? TestControllerBuilder不會調用您的Initialize,因爲它以不同的方式進行初始化。我建議你將自定義的Initialize()邏輯分解爲不同的方法。然後使用公共方法創建假(存根)子類,該方法調用這個因式分解保護的Initialize。你和我在一起嗎?

類似:

public abstract class ApplicationController : Controller 
{ 

    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     MyInitialzie() 
    } 
    protected void MyInitialize() 
    { 
     ControllerContext.XXX // do whatewer you want here. Context is already setted up 
    } 
} 

class FakeController: ApplicationController 
{ 
    public void CallMyInitialize() 
    { 
     MyInitialize(); 
    } 
} 

後來在測試類:

[Test] 
public void MyInitializeTest() 
{ 
    TestControllerBuilder builder = new TestControllerBuilder(); 
    FakeController controller = new FakeController(); 
    builder.InitializeController(controller); 

    controller.CallMyInitialize(); 
    //TODO: verification of MyInitialize assumptions 
} 

清楚了嗎?

+0

感謝鮑里斯,我仍然對你的回答感到滿意。我會按照你的指導,看看它是否有效。 – 2011-04-24 21:43:03

+0

我已經編輯了格式化和測試樣本的響應。希望現在好一點。 – 2011-04-24 22:12:58

+0

我愛你說:「你在我身邊嗎?」 :)無論如何,這是我的解決方案。 – Samuel 2012-10-15 19:37:47