Testowanie angulara a prywatne metody danego komponentu

0

Witam, od niedawna zagłębiam się w temat testów w Angularze i mam małą zagwozdkę odnośnie prywatnych metod.

Ogólnie możemy prywatną metodę spokojnie testować:

    describe('Convert function', () => {
        it('Emits string when input's typeof === NgbDate', () => {
            comp.modelChange.subscribe(emit => {
                expect(emit).toEqual('1999-01-01');
            });
            comp._convertAndEmit(new NgbDate(1999,1,1));
        });
    });

Taki test przechodzi prawidłowo, ale funkcja convertAndEmit 'świeci' mi się na czerwono w edytorze (błąd: Property _convertAndEmit is private and only accessible within class 'Klasa').
To jak jest z tymi prywatnymi metodami? Nie powinniśmy ich testować wcale? Czy może skoro test przechodzi, to nie ma się czym przejmować i nie definiują tego angularowe 'dobre praktyki'?

1

Nie powinniśmy ich testować wcale?

Tak, nie powinniśmy. Metoda prywatna to szczegół implementacyjny i testowanie jej tylko utrudnia późniejszy refaktor.

0

Rozumiem, w takim razie może źle podchodzę do tematu prywatnych/publicznych metod lub samego testowania.
Czy jeżeli mamy funkcje komponentu, ale wiemy, że warto by je było przetestować wtedy rezygnujemy z prywatnego oznaczenia? Do tej pory w większości ustalamy tak, że jeżeli metoda nie jest wołana na HTML'u, warto jest oznaczyć ją jako private, bo korzystamy z niej tylko w pliku .ts danego komponentu, pseudo przykład:

Z HTML'a wołamy funkcję wyznaczWybranaDate (która rzecz jasna jest publiczna).
Ale w środku tej funkcji wołamy kolejne trzy (prywatne):

  • pierwsza sprawdza czy podana data to początek czy koniec podawanego okresu,
  • druga sprawdza czy typ jest prawidłowy, jeśli nie to konwertuje tenże typ,
  • trzecie emituje wartość do naszego @Output

No i teraz jeżeli testujemy taki komponent możemy przetestować tylko wyznaczWybranaDate, która de facto tylko rozdziela zadania między funkcjami.
Co w takim wypadku robię źle jeżeli chodzi o podejście? Za dużo szastania prywatnymi metodami?

1

Do tej pory w większości ustalamy tak, że jeżeli metoda nie jest wołana na HTML'u, warto jest oznaczyć ją jako private

No i prawidłowo, wszystko co nie jest używane poza modułem / klasą powinno nie być eksporotowane / być oznaczone jako private w przypadku metod.

możemy przetestować tylko wyznaczWybranaDate, która de facto tylko rozdziela zadania między funkcjami

No i świetnie, nie musisz wołać metod prywatnych bezpośrednio by je przetestować. Ba, często nawet nie opłaca się metod publicznych testować bezpośrednio (bo testujemy raczej jednostki funkcjonalności, nie jednostki kodu).

W skrócie: testuj kod przez jego publiczny interface.

PS
Jak prywatne metody są wybitnie skomplikowane (jakieś algorytmy itp), tak że chciałbyś je jednak osobno przetestować, to moze być to znak, że warto wydzielić je do osobnego modułu.

PS2

  • pierwsza sprawdza czy podana data to początek czy koniec podawanego okresu,
  • druga sprawdza czy typ jest prawidłowy, jeśli nie to konwertuje tenże typ,

Metody te (a przynajmniej ta pierwsza) wyglądają na uniwersalne. Możliwe, że powinny to być funkcje biblioteczne, raczej niż metody konkretnej klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1