Mam klasę, która jest refaktoryzowana w 1 klasie głównej i 2 mniejszych klasach. Główne klasy korzystają z bazy danych (jak wiele moich klas) i wysyła wiadomość e-mail. Tak więc główna klasa ma IPersonRepositoryi IEmailRepositoryzastrzyk, który z kolei wysyła do 2 mniejszych klas.
Teraz chcę przetestować jednostkę w klasie głównej i nauczyłem się nie unittestować wewnętrznych działań klasy, ponieważ powinniśmy być w stanie zmienić wewnętrzne funkcjonowanie bez przerywania testów jednostkowych.
Ale ponieważ klasa używa IPersonRepositoryi IEmailRepository, MUSZĘ podać (mock / dummy) wyniki dla niektórych metod dla IPersonRepository. Główna klasa oblicza niektóre dane na podstawie istniejących danych i zwraca je. Jeśli chcę to przetestować, nie widzę, jak mogę napisać test bez określenia, że IPersonRepository.GetSavingsByCustomerIdzwraca x. Ale potem mój test jednostkowy „wie” o wewnętrznym działaniu, ponieważ „wie”, które metody wyśmiewać, a które nie.
Jak mogę przetestować klasę, która wstrzyknęła zależności, bez testowania wiedzy o elementach wewnętrznych?
tło:
Z mojego doświadczenia wynika, że wiele takich testów tworzy makiety dla repozytoriów, a następnie albo dostarcza odpowiednie dane dla makiet, albo testuje, czy podczas wykonywania została wywołana określona metoda. Tak czy inaczej, test wie o elementach wewnętrznych.
Teraz widziałem prezentację na temat teorii (którą wcześniej słyszałem), że test nie powinien wiedzieć o implementacji. Po pierwsze dlatego, że nie testujesz, jak to działa, ale także dlatego, że kiedy teraz zmienisz implementację, wszystkie testy jednostkowe kończą się niepowodzeniem, ponieważ „wiedzą” o implementacji. Chociaż podoba mi się koncepcja testów nieświadomych implementacji, nie wiem, jak to zrobić.
IPersonRepositoryobiektu, interfejs i wszystkie metody, które opisuje, nie są już „wewnętrzne”, więc nie jest to tak naprawdę problemem testu. Wasze prawdziwe pytanie powinno brzmieć: „jak mogę przefakturować klasy na mniejsze jednostki, nie ujawniając zbyt wiele publicznie”. Odpowiedź brzmi „utrzymuj interfejsy w niskiej jakości” (na przykład przestrzegając zasady segregacji interfejsów). To jest punkt 2 IMHO w odpowiedzi @ DavidArno (chyba nie muszę powtarzać tego w innej odpowiedzi).