如何测试MVC控制器的事件

时间:2009-11-05 07:33:08

标签: asp.net-mvc model-view-controller controller rhino-mocks

我想测试MVC控制器的OnExceptionOnActionExecuted事件。

如果我像这样使用mock:

        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 个答案:

答案 0 :(得分:15)

这是MVC的关注点分离原则之一。当您对方法进行单元测试时,您将独立于应用于其的任何过滤器来测试方法本身。 (而OnException()和OnActionExecuting()实际上只是美化过滤器。)

如果您想独立测试其他方法,您可以自由选择。通常,您可以通过调用过滤器来实现此目的:

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

您必须创建上下文对象以传递给这些方法。最后,您有三个单元测试:一个用于OnActionExecuting(),一个用于OnException(),另一个用于您正在测试的实际方法。这个设置的好处是,一旦您对过滤器进行了一次单元测试,您就不必再为其他任何单元测试而担心它们了。

例如,如果您有Method1(),Method2()和Method3(),则无需测试方法+过滤器的每个组合。只需要五个单元测试:OnActionExecuting(),OnException(),Method1(),Method2()和Method3()。这消除了冗余测试,并且可以更轻松地跟踪代码中的潜在错误。