7

MVC 컨트롤러의 OnException, OnActionExecuted 이벤트를 테스트하고 싶습니다. 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

+0

디버그 모드 및 중단 점 – Lullaby

답변

15

이것은 MVC의 원칙에 대한 구분 중 하나입니다. 메소드를 단위 테스트 할 때, 메소드 자체에 적용된 필터와 관계없이 메소드 자체를 테스트합니다. (그리고 OnException() 및 OnActionExecuting()은 실제로 찬미하는 필터입니다.)

다른 방법을 독립적으로 테스트하려는 경우 자유롭게 수행 할 수 있습니다. 당신이 이것에 대해 갈 것 일반적으로 방법과 같이 필터를 호출하는 것입니다 :

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

당신은 문맥을 만들어야합니다 이러한 방법에 전달할 객체. 결국 OnActionExecuting(), OnException(), 테스트중인 실제 메소드의 세 가지 단위 테스트가 있습니다. 이 설정에 대한 좋은 점은 필터를 한 번 단위 테스트했으면 다른 단위 테스트에 대해 더 이상 걱정할 필요가 없다는 것입니다.

예를 들어, Method1(), Method2() 및 Method3()이있는 경우 메서드 + 필터의 각 조합을 테스트하지 않아도됩니다. OnActionExecuting(), OnException(), Method1(), Method2() 및 Method3()의 5 가지 단위 테스트 만 수행하면됩니다. 이렇게하면 중복 테스트가 필요 없으며 코드의 잠재적 버그를 쉽게 추적 할 수 있습니다.

관련 문제