NUnit i ASP.NET MVC 3 – Intro

NUnit to narzędzie do przeprowadzania testów jednostkowych w projektach platformy Microsoft .NET.
Do naszej solucji tuż obok naszego projektu MVC 3 dodajemy nowy projekt Class Library (Visual C# -> Windows -> Class Library). Dla potrzeb artykułu będę operował nazwą projektu MVC 3 „TechBlog”. Projekt Class Library nazywamy „TechBlog.Tests”.
Następna rzeczą jaką trzeba wykonać jest dodanie referencji do projektu „TechBlog.Tests”:
Klikamy prawym na projekcie TechBlog.Tests” i wybieramy „Add Library Package Reference”.
Następnie w menu klikamy na Online i naszym oczom powinna się ukazać kolekcja paczek od Microsoft’u. Ułatwiamy sobie szukanie i w pole po prawej stronie wpisujemy Nunit. Po znalezieniu pakietu klikamy na install i zamykamy okno.

nunitAndAspNetMVC3IntroImg1

Dodajemy referencje do projektu TechBlog bo na nim będą oparte testy.
Dodajemy referencję do biblioteki System.Web.Mvc.dll możemy ją znaleźć:

Zmieniamy nazwę klasy Class1.cs na FileControllerTests.cs bo mam kontroler w projekcie TechBlog który nazywa się FileController, VS automatycznie będzie chciał zmienić zawartość klasy na co się zgadzamy.

W sekcji usingów dodajemy NUnit.Framework, TechBlog.Controllers. Do klasy FileControllerTests dodajemy atrybut [TestFixture].

Dodajemy nową metodę do klasy o nazwie „Put_Message_In_ViewBag_Upload”, dodajemy do niej atrybut [Test]. Dodajemy metodę z poniższego screena.

nunitAndAspNetMVC3IntroImg2

Żeby móc się odwołać  do ViewBag’a musimy zmienić typ zwracanego widoku w projekcie TechBlog metody Upload z ActionResult na ViewResult.
Oczywiście w ViewBag’u mam teraz zainicjowaną warość dla pola ID_Publication.
Jeżeli nic nie sknociliśmy powinno nam się udać zbudować projekt bez żadnych problemów.

nunitAndAspNetMVC3IntroImg3

Jeśli wykonałeś wszystko tak jak powyżej jesteś gotowy do pierwszych testów.
Otwieramy folder w którym znajdują się nasze projekty ( u mnie C:\PROJECTS\TechBlog). Wchodzimy do folderu packages\NUnit.2.5.10.11092\tools.
Znajdują się tam 2 programy które powinny nas interesować „nunit.exe” oraz „nunit-console.exe”.
Pierwszy to odpalenie testów jednostkowych w formie graficznej drugi w konsolowej.
Po uruchomieniu pierwszego programu wybieramy Open project i zaznaczamy TechBlog.Tests.dll.
Uruchamiamy i czekamy na efekt końcowy. Test przeszedł pomyślnie.

nunitAndAspNetMVC3IntroImg4

Dobra, to teraz chcemy żeby test się nie powiódł. Zamykamy Nunit.exe (trzeba zwolnić dll).
Usuwamy w projekcie Techblog w metodzie Upload  (kontroler FileController) inicjację pola viewbag ID_Publication. Kompilujemy po czym jeszcze raz odpalamy NUnit.exe.

nunitAndAspNetMVC3IntroImg5

Tym razem test się nie powiódł ponieważ oczekiwaliśmy wystąpienia pola z ViewBag’a ID_Section.
Drugi sposób na testowanie to odpalenie nunit-console. Możemy go odpalić w konsoli cmd w sposób przedstawiony poniżej:

Można też ustawić w visual studio żeby robiło się to nam automatycznie, bo odpalanie za każdym razem nunit.exe albo nunit-console.exe jest uciążliwe.
Więc, klikamy prawym na projekt TechBlog.Tests wybieramy Properties. W oknie które nam się pojawi na ekranie zaznaczamy Build Events.

nunitAndAspNetMVC3IntroImg6

W sekcji „Post-build event command line” wybieramy Edit Post-build. W nowym oknie klikamy macros I możemy wybrać SolutionDir oraz TargetPath.
Do edytora wpisujemy  poniższą ściężkę:
$(SolutionDir)packages\NUnit.2.5.10.11092\tools\nunit-console $(TargetPath)
Zatwierdzamy, zapisujemy i budujemy.

nunitAndAspNetMVC3IntroImg7

O nie! 🙂 Sprawdzamy co się stało, klikamy na output, mamy tam cały stacktrace tego co spowodowało błąd.

nunitAndAspNetMVC3IntroImg8

Test nie przeszedł próby. Oczekujemy „czegoś” a dostajemy null’a, a tego nie chcieliśmy.
Po dodaniu w TechBlog w akcji Upload ViewBag’a z polem ID_Publication nie ma błędów – testy przechodzą pomyślnie.
Uwaga: Jeśli ścieżka w której znajduje się projekt zawiera białe znaki to przy próbie zbudowania aplikacji zwrócony zostanie błąd 9009. W tej chwili omijam to tak, że trzymam projekty na dysku C w folderze projekty i wszystko działa jak należy.
Zachęcam do testowania i zapoznania się z tematyką TDD – najpierw piszemy testy, a dopiero potem kod.