Testowanie obsługi zdarzeń oraz faktu ich wywołania jest niekiedy równie ważne co przetestowanie każdej innej integracji pomiędzy dwoma obiektami. Scenariusz jest na tyle specyficzny, że poświęcę mu osobną notkę.
Wywoływanie zdarzeń
Zapomnijmy na razie o maglowanym przez ostatnie kilka wpisów kontrolerze i spójrzmy na inną sytuację. Wyobraźmy sobie, że mamy w systemie klasę odpowiedzialną za podpinanie się pod różne zdarzenia i logowanie ich w celach diagnostycznych. Jednym z takich zdarzeń może być niepoprawna próba uwierzytelnienia użytkownika, której sygnalizowanie wrzucimy do serwisu odpowiedzialnego dokładnie za tą czynność – uwierzytelnianie. Spójrzmy więc na zmodyfikowany interfejs IAuthenticationService:
Chcemy, aby w momencie wystąpienia tego zdarzenia zalogowana została odpowiednia informacja. Do logowania czegokolwiek zdefiniujemy interfejs ILogger:
Odpowiedzialność za obserwowanie zdarzenia oraz przekazywanie odpowiednich informacji do loggera spoczywać będzie na specjalnej klasie EventLogger. Jej implementacja nas nie interesuje; interesuje nas test, który spełnienie tego oczekiwania weryfikuje. Potrzebujemy więc mechanizmu, który pozwoli nam na wywołanie zdarzenia InvalidLoginAttempt na zamockowanej implementacji interfejsu IAuthenticationService.
Rhino Mocks posiada dwa sposoby na osiągnięcie tego celu. Pierwszy z nich jest stary i brzydki. Ale wszyscy będziemy kiedyś starzy i brzydcy, więc mimo to go zademonstruję:
Drugi sposób, dodany w wersji 3.5, to już cud, miód i orzeszki, zobaczcie sami:
Czyż nie fajne?
Testowanie wystąpienia zdarzenia
Tą kwestię poruszyłem już kiedyś wcześniej, ale dla zachowania ładu i składu wkleję kod odpowiedzialny za przetestowanie czy dane zdarzenie zostało wywołane:
1: var someClass = new SomeClass(); 2: bool eventRaised = false; 3: someClass.TestEvent += delegate 4: { 5: eventRaised = true; 6: }; 7: 8: someClass.ShouldRaise(); 9: Assert.IsTrue(eventRaised);
Zainteresowanych kilkoma zdaniami więcej na ten temat odsyłam do wspomnianego posta “Testowanie wystąpienia zdarzenia”.