FluentAssertions.Mvc – asserty dla ASP.NET MVC

Wprowadzenie

Dwa tygodnie temu opublikowałem wpis o bibliotece Fluent Assertions, która bardzo ułatwia pisanie assertów w testach (zachęcam do przeczytania w pierwszej kolejności owego wpisu). Pokazałem, jak korzystać z biblioteki oraz jak łatwo można rozszerzać możliwości biblioteki o własne metody. Dzisiaj natomiast pokażę Ci, jak testować kontrolery w ASP.NET MVC za pomocą rozszerzenia o nazwie FluentAssertions.MVC (https://github.com/fluentassertions/fluentassertions.mvc). Poćwiczymy również dodawanie kolejnych metod rozszerzających możliwości Fluent Assertions.

Przykład do testów

Zacznę od przedstawienia kodu, który będę chciał przetestować. Ma on trzy proste akcje. Details służy do wyświetlenia informacji o produkcie, natomiast dwie akcje Create służą do dodania nowego produktu. Kontroler wygląda tak:

Kontroler posiada dwie zależności. Pierwsza to zależność związana z logiką biznesową produktów, natomiast druga to zależność dotycząca automappera. Logika jest bardzo prosta i zawiera dwie metody, których, myślę, nie trzeba tłumaczyć:

Testy akcji Details

Do testów, poza Fluent Assertions, wykorzystuję również xUnit, Moq oraz nBuilder.

Pierwsze testy napiszemy do akcji Details. W tym przypadku (tak jak zrobiłem to również w innych wpisach o testach) utworzyłem klasę bazową dla wszystkich testów akcji w kontrolerze. W klasie tej znajduje się metoda Create tworząca kontroler do testów i jego wszystkie zależności:

Rozszerzenie Fluent Assertions dla projektów ASP.NET MVC ma kilka wersji. W zależności od użytego ASP.NET MVC używamy odpowiedniej wersji pakietu. W przykładzie używam wersji 5, dlatego zainstalowałem pakiet FluentAssertions.Mvc5 (https://www.nuget.org/packages/FluentAssertions.Mvc5/). Jeśli używasz wcześniejszej wersji ASP.NET MVC, to wtedy odpowiednio zmieniasz numer na końcu nazwy pakietu.

Testy akcji Details są w dedykowanej klasie, która wygląda tak:

W klasie nadpisuję metodę Create z klasy bazowej, w której dodatkowo konfiguruję podstawowe zachowanie mocków. Dzięki temu same testy będą już prostsze i zawierać będą tylko drobne zmiany w domyślnej konfiguracji.

Pierwszy test sprawdza, jak zachowa się akcja, gdy logika biznesowa zwróci błędny wynik (na ogół oznacza to, że produktu o danym ID nie ma w bazie). W przykładzie założyłem, że w takiej sytuacji użytkownik ma zostać przekierowany do akcji Index z listą wszystkich produktów.

W teście użyłem dodatkowych metod z FluentAssertions.MVC. Metoda BeRedirectToRouteResult sprawdza, czy wynikiem akcji jest przekierowanie. WithAction sprawdza natomiast nazwę akcji, do której użytkownik zostanie przekierowany.

Drugi test sprawdza sytuację, w której logika zwróci dane produktu, oraz czy akcja wyświetli odpowiedni widok i przekaże do niego odpowiednie dane (viewmodel). Metoda BeViewResult sprawdza, czy wynikiem jest widok, natomiast WithDefaultViewName sprawdza, czy nazwa widoku jest domyślna (taka sama, jak nazwa akcji). Na końcu sprawdzam, czy obiekt przekazany do widoku jest taki sam, jak viewmodel zwrócony przez automapper.

Jak widać, dodatkowe metody bardzo ułatwiają pisanie testów kontrolerów.

Darmowy kurs Visual Studio

Pracując z setkami programistów, zauważyłem, że większość osób nie pracuje efektywnie w Visual Studio. W skrajnych przypadkach korzystali z kopiowania z wykorzystaniem menu Edit. Wiem, że to dziwne, ale naprawdę niektórzy tak pracują. Dlatego postanowiłem stworzyć kurs Visual Studio – aby pomóc koleżankom i kolegom w efektywniejszej pracy.

Przygotowałem 20 lekcji e-mail, w których pokażę Ci, w jaki sposób pracować efektywniej i szybciej w Visual Studio. Poznasz dodatki, bez których nie wyobrażam sobie pracy w tym IDE.

Po więcej informacji zapraszam na dedykowaną stronę kursu: Darmowy Kurs Visual Studio.

Quiz C#

Ostatnio przygotowałem również quiz C#, w którym możesz sprawdzić swoją wiedzę. Podejmiesz wyzwanie?

Brakujące metody

FluentAssertions.MVC zawiera sporo metod, które przydają się w testowaniu kontrolerów. Mnie jednak brakowało jednej metody, którą dodaję do swoich projektów.

Do wyświetlenia błędów walidacji wykorzystuję domyślny mechanizm z ASP.NET MVC. Kontroler przekopiowuje błędy z klasy Result do ModelState, dlatego potrzebuje prostej metody, która sprawdzałaby, czy w ModelState znajduje błąd zwrócony przez logikę. Metoda wygląda tak:

Podobnie, jak to było wcześniej, aby rozszerzyć Fluent Assertions, musimy dodać dwie klasy. Pierwsza dodaje metodę Should do typu, który chcemy testować (tutaj klasę Controller). Druga klasa dziedziczy natomiast po ReferenceTypeAssertions i zawiera metodę HasError, która sprawdza, czy w ModelState jest błąd o określonym komunikacie dla odpowiedniej właściwości.

Metody tej użyjemy w teście akcji Create naszego testowego kontrolera.

Testy akcji Create

W przykładzie przygotowałem jeden test akcji Create (powiązanej z żądaniem post), aby sprawdzić użycie metody HasError.

Podobnie jak wyżej, test znajduje się w dedykowanej klasie dla akcji Create. W klasie tej nadpisujemy metodę Create z domyślną konfiguracją mocków. Sama klasa z testem wygląda tak:

Test w pierwszej kolejności sprawdza, czy akcja zwróciła domyślny widok z przekazanym viewmodelem (wykorzystałem te same metody, co w teście akcji Details). Na końcu za pomocą dodanej metody HasError sprawdzam, czy w ModelState znajduje się taki sam błąd, jaki zwróciła logika biznesowa (komunikat „Error” dla właściwości „Property”).

Przykład

Pracując nad tym wpisem, rozszerzyłem przykład z poprzedniego wpisu o Fluent Assertions. Dla przypomnienia – wpis znajduje się w repozytorium https://github.com/danielplawgo/FluentAssertionTests. Po pobraniu nie wymaga jakiejś dodatkowej konfiguracji.

Podsumowanie

Mam nadzieję, że po raz kolejny udało mi się pokazać Ci, jak fajną biblioteką jest Fluent Assertions. Tym razem zobaczyłeś, jak łatwo pisać testy kontrolerów w ASP.NET MVC. Zobaczyłeś również, jak rozszerzyć dostępne metody w sytuacji, gdy czegoś brakuje – czy to w samym Fluent Assertions, czy w jakimś jej rozszerzeniu.

Gorąco zachęcam do używania Fluent Assertions!

2 thoughts on “FluentAssertions.Mvc – asserty dla ASP.NET MVC

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *