Innego dnia czytałem trochę o Testowaniu Jednostek i widziałem kilka przykładów, w których ludzie tworzą interfejs repozytorium (tj. IExampleRepository
), A następnie tworzą prawdziwe repozytorium ( public class ExampleRepository : IExampleRepository
) i repozytorium, które będzie używane do testowania jednostek ( FakeExampleRepository : IExampleRepository
).
W IExampleRepository
implementacji stosowano te same metody, co w ExampleRepository
przypadku różnych zapytań Linq.
Jaki jest tutaj dokładnie cel? Myślałem, że jedna część jednostki testującej twój kod upewnia się, że metoda działa poprawnie? Ale kiedy używam dwóch całkowicie różnych zapytań, jednego dla „rzeczywistego” i jednego w teście, jaki sens ma test?
ExampleRepository
, najlepiej użyć próbnego. Uzasadnieniem jest to, że nie przeprowadzasz testów jednostkowych repozytorium, ale coś innego.ExampleRepository
, użyj prawdziwej rzeczy. Jeśli przeprowadzasz testy jednostkoweRepositoryController
, powinieneś użyć tylkoFakeExampleRepository
tego, który zwraca wstępnie określone wartości. W ten sposób, jeśli wkradnie się błądExampleRepository
, tylko ten test jednostkowy zakończy się niepowodzeniem -RepositoryController
testy będą nadal udane, więc wiesz, że nie ma tam błędu. Jeśli kontroler użył prawdziwego repozytorium, że zarówno one być zawodzi, a ty nie wiesz, gdybyś miał 1 błąd lub 2.Zgadzam się z dwiema odpowiedziami jk. i Jan Hudec - dają naprawdę dobre informacje. Ale pomyślałem, że dodałbym trochę.
Twoje pierwsze pytanie („Jaki dokładnie jest tutaj cel?”) Jest ważne. W opisywanym przypadku prawdziwym celem jest przetestowanie klas korzystających z
IExampleRepository
interfejsu, a nie testowanie implementacji repozytorium. UtworzenieFakeExampleRepository
pozwala przetestować te klasy klienta bez obawy o szczegóły prawdziwej klasy repozytorium.Jest to szczególnie prawdziwe, jeśli obiekt, który próbujesz skonfigurować, utrudnia testowanie (np. Uzyskuje dostęp do systemu plików, wywołuje usługę internetową lub rozmawia z bazą danych). Używając interfejsów (i innych takich technik), utrzymujesz niskie sprzężenie. Dlatego klasa
X
musi tylko wiedzieć o interfejsie i nie musi znać szczegółów implementacji. Celem jest upewnienie się, że klasaX
postępuje właściwie.Wyśmiewanie (lub karczowanie, fałszowanie ... są różne różnice) to potężne narzędzie do testowania jednostek i TDD. Jednak ręczne tworzenie i utrzymywanie tych implementacji może być uciążliwe. Dlatego większość języków ma teraz kpiące biblioteki do pomocy. Ponieważ używasz C #, polecam Moq, ponieważ jest prosty i bardzo wydajny. Następnie możesz przetestować interfejs bez gromadzenia dodatkowego kodu dla próbnych implementacji.
źródło
the real objective is to test the classes that are utilizing the IExampleRepository interface
to nie jest do końca prawda. Celem jest przetestowanie go niezależnie od IExampleRepository. +1 za zalecenie dobrych ram izolacji.IExampleRepository
ponieważ testowana klasa jest sprzężona z tym interfejsem. Ale jest niezależny od jakichkolwiek implementacji interfejsu. Przyznaję, że moje wyjaśnienie przydałoby się nieco bardziej finezji. :)Izolacja.
Pomysł jednostki przetestuj ją, aby przetestować najmniejszą możliwą jednostkę kodu. Robisz to, izolując go od wszystkich innych kodów produkcyjnych w teście.
Tworząc fałszywe klasy jedynym kodem produkcyjnym jest klasa testowana.
Jeśli poprawnie utworzysz fałszywe repozytorium, a test się nie powiedzie, wiesz, że problem dotyczy testowanego kodu. Zapewnia to bezpłatną diagnozę.
Spójrz na struktury izolacyjne (takie jak Moq, jak sugeruje @Allan), aby móc szybko wygenerować te podróbki, aby skonfigurować warunki testowe i użyć ich do potwierdzenia.
źródło
Istnieją trzy powody, dla których warto udostępnić próbną instancję do testu jednostkowego:
źródło