Podczas implementacji testów jednostkowych zachodzi czasami potrzeba napisania kodu weryfikującego zachowanie obiektów po wystąpieniu zdarzeń. Scenariusz taki jest wspierany przez tzw “mocking frameworks”. Za świetny przykład może służyć odświeżony w wersji 3.5 mechanizm biblioteki Rhino.Mocks ze swoją metodą rozszerzającą Raise.
Co jednak w sytuacji odwrotnej, gdy nie chcemy badać reakcji na zdarzenie, a jedynie upewnić się, że zostało ono wywołane? Sposób przedstawiony tutaj (“Test Event Was Raised”) nie bardzo mi się podoba. Wystarczyło jednak chwilę pomyśleć żeby strząchnąć zaciemnienie z ciemienia i napisać:
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);
Mi to wygląda bardziej “kompaktowo”.
Używam identycznego rozwiązania :)
Mnie się podoba jednak bardziej ta wersja z Blah ;) W ogóle tak się zastanawiam jak ten kod by zadziałał, kiedy w obsłudze eventa by było np. przełączenie się na inny wątek i powrót i inne szaleństwa.
@Tom:
Obsługa zdarzenia zależy wyłącznie od ciebie podczas pisania testu. Zauważ, że tworzę instancję i podpinam pod nią delegata -> i tylko to zostanie wykonane po wywołaniu zdarzenia. Chodzi tu tylko o sprawdzenie czy dane zdarzenie zostało wywołane, więc ustawienie flagi jest tym czego potrzebujemy. Testowanie konkretnej obsługi zdarzenia to testy innego obiektu, który się pod owo zdarzenie podpina – czyli sytuacja odwrotna.