2009-11-05 153 views
7

的事件我想測試OnExceptionOnActionExecuted事件的MVC控制器。如何測試一個MVC控制器

如果我使用的模擬像這樣:

 var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
     var request = MockRepository.GenerateMock<HttpRequestBase>(); 

     httpContext.Expect(c => c.Request).Return(request).Repeat.AtLeastOnce(); 
     request.Expect(r => r.IsAuthenticated).Return(true).Repeat.AtLeastOnce(); 


     var controller = new MyController() ; 

     controller.ControllerContext = new ControllerContext(httpContext, 
                  new RouteData(), 
                  controller); 

     var result = controller.Execute() as ViewResult; 

...操作方法執行,但事件不被調用。

+1

我不知道你實際上已經連接到事件......你怎麼知道他們不執行? – jrista 2009-11-05 07:38:55

+0

調試模式和斷點 – Lullaby 2009-11-05 08:13:08

回答

15

這是分離的顧慮MVC的原則之一。當你在單元測試一個方法時,你正在測試方法本身,而不依賴於應用它的任何過濾器。 (和onException的()和OnActionExecuting()其實只是榮耀的過濾器。)

如果要單獨測試的其他方法,你可以這樣做。通常你會去了解這個方法是調用像這樣的過濾器:

((IActionFilter)controller).OnActionExecuting(...) 
((IExceptionFilter)controller).OnException(...) 

你必須創建上下文對象傳遞給這些方法。最後,你有三個單元測試:一個用於OnActionExecuting(),一個用於onException的(),以及一個用於正在測試的實際方法。關於這個設置的好處是,一旦你單元測試了一次過濾器,你就不必再爲其他單元測試擔心它們了。

例如,如果有一個方法1(),方法2()和方法3(),則不需要進行測試方法+過濾器的每一種組合。只需要五個單元測試:OnActionExecuting(),OnException(),Method1(),Method2()和Method3()。這消除了多餘的測試,並且更容易追蹤代碼中的潛在錯誤。