fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Testowanie klas abstrakcyjnych przy pomocy mocków


03.09.2009

Generalnie moment, w którym natkniemy się na potrzebę przetestowania testami jednostkowymi klasy abstrakcyjnej powinien być momentem okrzyku: “refactoring czas zacząć!”. Takie coś teoretycznie nie powinno mieć miejsca; testuje się raczej funkcjonalność faktycznie wykorzystywaną w systemie, a więc bardziej klasy z niej dziedziczące. Odpowiednia hierarchia klas uzupełniona odpowiednią hierarchią testów jednostkowych rozwiązuje problem. Ale wiadomo – ideały sobie, a życie sobie.

Cóż więc zrobić, gdy mamy klasę abstrakcyjną wymagającą przetestowania? Na przykład taką:

Można specjalnie na potrzeby testu zaimplementować klasę dziedziczącą, utworzyć jej instancję i odpowiednią metodę wywołać. Ale możemy również skorzystać z mechanizmów RhinoMocks, którym efektem ubocznym jest taka konstrukcja:

CallAbstract to napisana przeze mnie extension method, poniżej jej implementacja. Przy okazji można przyjrzeć się doda:

  1:  public static class MockUtils
  2:  {
  3:  	public static void CallAbstract<T>(Action<T> operation, params object[] argumentsForConstructor) where T : class
  4:  	{
  5:  		var stub = MockRepository.GenerateStub<T>(argumentsForConstructor);
  6:  		stub.Stub(operation).CallOriginalMethod(OriginalCallOptions.NoExpectation);
  7:  		operation(stub);
  8:  	}
  9:  }

Zaznaczam jeszcze raz, że teoretycznie taka sytuacja nie powinna mieć miejsca. Ale jeśli już ma, to jest to całkiem niezłe jej rozwiązanie “na szybko”.

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Zapisując się na newsletter zgadzasz się na przetwarzanie Twoich danych osobowych w celu wysyłania na wskazany przez Ciebie adres e-mail informacji handlowych o nowościach, promocjach, produktach i usługach związanych z serwisem devstyle.pl. Będzie to marketing bezpośredni, do realizacji którego wykorzystam Twoje telekomunikacyjne urządzenia końcowe. Administratorem Twoich danych osobowych będzie Maciej Aniserowicz prowadzący działalność gospodarczą w Białymstoku (15-215) przy ul. Konopnickiej 14/8, NIP 5422824401. Przysługuje Tobie prawo do cofnięcia zgody, żądania wglądu do Twoich danych, wniesienia sprzeciwu co do ich przetwarzania, sprostowania, usunięcia i ograniczenia przetwarzania. Więcej informacji o tym jak przetwarzam Twoje dane znajdziesz na devstyle.pl/RODO. Powered by ConvertKit
Notify of
Farol
Farol

A nie lepiej skorzystać z PartialMock?
http://ayende.com/Wiki/(S(az3elprzof4y5j2clzmycn55))/Default.aspx?Page=Rhino+Mocks+Partial+Mocks&Code=1&AspxAutoDetectCookieSupport=1
Właśnie one umożliwiają testowanie jakiejś części klasy (włącznie z abstrakcyjnymi).

procent
procent

@Farol:
Czlowiek uczy sie cale zycie a i tak glupi umiera:). Dzieki za linka.

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Facebook

Książka

Zobacz również