2009-03-04 9 views
7

Na mojej klasie kontrolera znajduje się ActionFilter. Metoda OnActionExecuting zostaje wywołana, gdy wywoływana jest akcja kontrolera w aplikacji internetowej.Jak mogę przetestować działanie ActionFilter w ASP.NET MVC?

Teraz nazywam Action w unittest:

NiceController niceController = new NiceController(); 
    ActionResult result = niceController.WhateverAction(); 

Czy istnieje sposób, aby mieć ActionFilter nazwie?

Odpowiedz

9

Aby automatyczne wywoływanie ActionFiltra było konieczne, należy uruchomić wywoływanie akcji kontrolera. Jest to możliwe, ale oznacza to, że framework MVC spróbuje i wykona wynik. Oznacza to, że będziesz musiał użyć makiet, aby zablokować wykonanie wyniku. Ponownie, jest to możliwe, ale oznacza to, że twój test jednostkowy staje się bardziej kpiący niż rzeczywisty kod. Może być bardziej poprawne, aby przetestować filtr bezpośrednio. W końcu fakt, że wywoływane jest narzędzie OnActionExecuting, jest cechą frameworka i nie ma potrzeby testowania jednostki w samej strukturze.

Ale myślę, że to, co naprawdę mówisz, to że chcesz przetestować WhateverAction, a ta akcja nie zadziała, dopóki ActionFilter nie zostanie wykonany.

Po pierwsze, chciałbym zadać pytania dotyczące tego projektu. Czy to prawda? To może być. Rozsądne jest na przykład, że akcja z atrybutem Autoryzuj może zakładać, że po uruchomieniu jest zalogowany użytkownik. Oczywiście działanie powinno to sprawdzić, ale domniemanie jest bezpieczne. Z drugiej strony, działania nie powinny prawdopodobnie wymagać filtrów do inicjowania akcji. Powinieneś zadać pytanie, ale odpowiedź brzmi, że projekt jest poprawny.

W tym przypadku najlepszą decyzją dla testu jednostkowego może być ręczne wykonanie filtru w teście jednostki, a do napisanie oddzielnego testu jednostki, który udowodni, że akcja jest ozdobiona odpowiednim atrybutem.

+0

więcej informacji: http : //stackoverflow.com/questions/10197677/how-to-test-that-a-method-argument-is-decorated-w--- attribute- – Spock

0

napisać oddzielny badanej jednostki, która dowodzi, że akcja jest ozdobiony prawidłowego atrybutu

Oto jak można napisać taki test jednostkowy

Type t = typeof(MyController); 
Assert.IsTrue(t.GetCustomAttributes(typeof(MyCustomAttribute)).Length > 0); 
Powiązane problemy