7

Chcę przetestować zdarzenie OnException, OnActionExecuted kontrolera MVC.Jak mogę przetestować zdarzenie kontrolera MVC

Jeśli używam makiety tak:

 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; 

... metoda działania jest wykonywany, ale zdarzenia nie są wywoływane.

+1

Nie widzę, żebyś rzeczywiście był związany z wydarzeniami ... skąd wiesz, że nie są wykonywane? – jrista

+0

Tryb debugowania i punkty przerwania – Lullaby

Odpowiedz

15

Jest to jeden z rozdzielenia obaw zasad MVC. Kiedy testujesz metodę metodą jednostkową, testujesz samą metodę, niezależnie od filtrów zastosowanych do niej. (I OnException() i OnActionExecuting() są naprawdę tylko gloryfikowanymi filtrami.)

Jeśli chcesz przetestować te inne metody samodzielnie, możesz to zrobić. Normalnie sposób chcesz go o to przez wywołanie filtry tak:

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

Musisz utworzyć kontekst obiektów przejść do tych metod. Na koniec masz trzy testy jednostkowe: jeden dla OnActionExecuting(), jeden dla OnException() i jeden dla rzeczywistej testowanej metody. Zaletą tej konfiguracji jest to, że gdy już raz przetestujesz filtry, nie musisz już martwić się nimi o żadne inne testy jednostkowe.

Na przykład, jeśli masz Method1(), Method2() i Method3(), nie musisz testować każdej kombinacji metod + filtrów. Po prostu wykonaj pięć testów jednostkowych: OnActionExecuting(), OnException(), Method1(), Method2() i Method3(). Eliminuje to zbędne testowanie i ułatwia wykrywanie potencjalnych błędów w kodzie.

Powiązane problemy