Void zwracane typy / podprogramy to stare wiadomości. Nie wykonałem zwrotu typu Void (chyba, że byłem wyjątkowo leniwy) od 8 lat (od czasu tej odpowiedzi, a więc trochę przed tym pytaniem).
Zamiast metody takiej jak:
public void SendEmailToCustomer()
Utwórz metodę zgodną z paradygmatem int.TryParse () firmy Microsoft:
public bool TrySendEmailToCustomer()
Być może nie ma żadnych informacji, które Twoja metoda musiałaby zwrócić do użycia na dłuższą metę, ale zwracanie stanu metody po jej wykonaniu jest bardzo przydatne dla wywołującego.
Ponadto bool nie jest jedynym typem stanu. Wiele razy poprzednio utworzona podprocedura mogła w rzeczywistości zwrócić trzy lub więcej różnych stanów (dobry, normalny, zły itp.). W takich przypadkach po prostu użyjesz
public StateEnum TrySendEmailToCustomer()
Jednak podczas gdy Try-Paradigm w pewnym stopniu odpowiada na to pytanie, jak przetestować zwrot z pustej przestrzeni, istnieją również inne kwestie. Na przykład, podczas / po cyklu „TDD”, będziesz „refaktoryzować” i zauważysz, że robisz dwie rzeczy swoją metodą… łamiąc w ten sposób „zasadę pojedynczej odpowiedzialności”. Więc najpierw należy się tym zająć. Po drugie, mogłeś zidentyfikować zależność ... dotykasz „Trwałe” dane.
Jeśli zajmujesz się dostępem do danych w metodzie, o której mowa, musisz dokonać refaktoryzacji w architekturę n-warstwową lub n-warstwową. Ale możemy założyć, że kiedy mówisz „Ciągi znaków są następnie wstawiane do bazy danych”, w rzeczywistości masz na myśli wywołanie warstwy logiki biznesowej lub coś w tym rodzaju. Tak, założymy, że.
Kiedy tworzony jest obiekt, rozumiesz teraz, że obiekt ma zależności. To wtedy musisz zdecydować, czy zamierzasz wykonać Dependency Injection na obiekcie, czy na metodzie. Oznacza to, że Twój Konstruktor lub metoda, o której mowa, potrzebuje nowego parametru:
public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)
Teraz, gdy możesz zaakceptować interfejs obiektu warstwy biznesowej / danych, możesz wyszydzać go podczas testów jednostkowych i nie mieć żadnych zależności ani obawiać się „przypadkowych” testów integracji.
Więc w swoim aktywnym kodzie przekazujesz PRAWDZIWY IBusinessDataEtc
obiekt. Ale w testach jednostkowych przekazujesz IBusinessDataEtc
obiekt MOCK . W tym makiecie można dołączyć właściwości niezwiązane z interfejsem, takie jak int XMethodWasCalledCount
lub coś, czego stan (y) są aktualizowane, gdy wywoływane są metody interfejsu.
Więc twój test jednostkowy przejdzie przez twoją metodę (y) -w pytaniu, wykona jakąkolwiek logikę, którą ma i wywoła jedną lub dwie lub wybrany zestaw metod w twoim IBusinessDataEtc
obiekcie. Kiedy wykonujesz swoje asercje na koniec testu jednostkowego, masz teraz kilka rzeczy do przetestowania.
- Stan „procedury podrzędnej”, która jest teraz metodą Try-Paradigm.
- Stan twojego
IBusinessDataEtc
obiektu Mock .
Aby uzyskać więcej informacji na temat pomysłów na iniekcję zależności na poziomie konstrukcji ... w odniesieniu do testów jednostkowych ... zapoznaj się z wzorcami projektowymi programu Builder. Dodaje jeszcze jeden interfejs i klasę dla każdego aktualnego interfejsu / klasy, ale są one bardzo małe i zapewniają OGROMNY wzrost funkcjonalności dla lepszego testowania jednostek.