Asp.net-Mvc
如何測試 MVC 控制器的事件
我想測試 MVC 控制器的
OnException,OnActionExecuted事件。如果我像這樣使用模擬:
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;…動作方法正在執行,但未呼叫事件。
這是MVC的關注點分離原則之一。當您對方法進行單元測試時,您正在測試方法本身,而與應用於它的任何過濾器無關。(而且 OnException() 和 OnActionExecuting() 實際上只是美化的過濾器。)
如果您想獨立測試這些其他方法,您可以自由地這樣做。通常你會這樣做的方式是呼叫過濾器,如下所示:
((IActionFilter)controller).OnActionExecuting(...) ((IExceptionFilter)controller).OnException(...)您必須創建上下文對像以傳遞給這些方法。最後,您有三個單元測試:一個用於 OnActionExecuting(),一個用於 OnException(),一個用於您正在測試的實際方法。這種設置的好處是,一旦您對過濾器進行了一次單元測試,您就不必再為任何其他單元測試擔心它們了。
例如,如果您有 Method1()、Method2() 和 Method3(),則無需測試方法 + 過濾器的每個組合。只需要有五個單元測試:OnActionExecuting()、OnException()、Method1()、Method2() 和 Method3()。這消除了冗餘測試,並且更容易追踪程式碼中的潛在錯誤。