2013-07-26 14 views
12

Kodowałem przypadki testowe dla aplikacji kątowej z użyciem jaśminu. Ale wiele wewnętrznych metod jest zadeklarowanych jako prywatne w usługach.Metoda prywatna Testowanie jednostkowe z Jasmine

Przykład:

App.service('productDisplay', function(){ 
    var myPrivate = function(){ 
     //do sth 
    } 
    this.doOfferCal = function(product, date){ 
     //call myPrivate 
     //do sth too 
     return offer; 
    } 
}); 

Korzystanie jaśmin to proste do testowania kodu dla "doOfferCal", ale chcę napisać badanej jednostki dla myPrivate też.

Jak mogę to zrobić?

Z góry dziękuję.

+0

Możliwy duplikat [Jak to zrobić przetestować klasę, która ma prywatne metody, pola lub klasy wewnętrzne?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or -inner-classes) – Raedwald

Odpowiedz

0

Aby przetestować funkcje wewnętrzne, nazywam funkcję zewnętrzną, która wywołuje funkcję wewnętrzną, a następnie zmienia moje dane wejściowe zgodnie z wymaganiami funkcji wewnętrznej. Tak więc w twoim przypadku wywołasz "productDisplay" i zmienisz swoje dane wejściowe na podstawie potrzeb "myPrivate", a następnie zweryfikujesz, że masz oczekiwane wyniki. Możesz także szpiegować "myPrivate" i testować rzeczy w ten sposób, używając .havebeencalledwith lub .andcallrough.

8

Czy istnieje szczególny powód, dla którego chcesz przetestować swoje prywatne metody?

Testując doOfferCal(), domyślnie testujesz, że myPrivate() postępuje właściwie.

Chociaż jest to dla RailsConf, Sandi Metz ma bardzo dobrą rozmowę na what should be tested.

+0

Mój "doOfferCal" wywoływał wiele prywatnych metod i ostatecznie zwracał złożony wynik, ponieważ uważał, że dobrze byłoby przetestować każdą prywatną metodę. Przy okazji, czy masz jakieś sugestie w tej sytuacji? – arnold

+2

Jedna szkoła myśli, że prywatne metody są szczegóły realizacji. Testując prywatne metody, twoje testy zostaną przerwane, mimo że twoja publiczna metoda nadal działa poprawnie. W rezultacie może się okazać, że testy będą zbyt kruche i odstraszą deweloperów od ulepszania/refaktoryzacji implementacji. – achan

+2

Niestety, nie zdawałem sobie sprawy z naciśnięcia klawisza Enter, aby wysłać mój wpis. W tym przypadku chciałbym wykonać test 'doOfferCal()', a następnie zweryfikować złożony obiekt, który zwraca. Jeśli ten test przejdzie, wszystkie prywatne metody pomiędzy nimi działają zgodnie z przeznaczeniem. Jestem pewien, że znajdziesz ludzi popierających prywatne metody, ale to jest to, co uznałem za najlepsze dla mnie pod względem pisania przydatnych i możliwych do utrzymania testów jednostkowych. – achan

2

Achan jest w 100% rację, ale czy naprawdę trzeba wywołać metodę prywatną w badaniach (co powinno być nigdy :-)) można to zrobić przez:

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough(); 
myPrivateSpy.call(); 
Powiązane problemy