(Jest tu powiązane pytanie: test Jasmine nie widzi modułu AngularJS )
Chcę tylko przetestować usługę bez uruchamiania Angulara.
Spojrzałem na kilka przykładów i tutorial, ale nigdzie się nie wybieram.
Mam tylko trzy pliki:
myService.js: gdzie definiuję usługę AngularJS
test_myService.js: gdzie definiuję test Jasmine dla usługi.
specRunner.html: plik HTML z normalną konfiguracją jasmine i gdzie importuję poprzednie dwa inne pliki oraz Jasmine, Angularjs i angular-mocks.js.
Oto kod usługi (który działa zgodnie z oczekiwaniami, gdy nie testuję):
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
Ponieważ próbuję przetestować usługę w izolacji, powinienem mieć do niej dostęp i sprawdzić ich metody. Moje pytanie brzmi: jak mogę wstrzyknąć usługę w moim teście bez ładowania AngularJS?
Na przykład, jak mogę przetestować wartość zwracaną dla metody usługi z Jasmine w następujący sposób:
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
beforeEach
przypadku wielu ... wielu ... wielu testów niezbędnych do wykonania usługi? Testowanie modelu danych (usługi) i zawiera on mnóstwo zmiennych globalnych. Dzięki, C§Chociaż powyższa odpowiedź prawdopodobnie działa dobrze (nie próbowałem jej :)), często mam dużo więcej testów do wykonania, więc nie wstrzykuję w nich samych. Pogrupuję przypadki it () w bloki opisujące i uruchomię wstrzyknięcie w bloku beforeEach () lub beforeAll () w każdym bloku opisywania.
Robert ma również rację, mówiąc, że musisz użyć wtryskiwacza Angular $, aby uświadomić testom serwis lub fabrykę. Angular również używa tego wtryskiwacza w twoich aplikacjach, aby poinformować aplikację, co jest dostępne. Można go jednak wywołać w więcej niż jednym miejscu, a także niejawnie zamiast jawnie. Zauważysz w moim przykładowym pliku testu specyfikacji poniżej, blok beforeEach () niejawnie wywołuje wtryskiwacz, aby udostępnić rzeczy do przypisania w testach.
Wracając do grupowania rzeczy i używania bloków przed, oto mały przykład. Tworzę usługę Cat Service i chcę ją przetestować, więc moja prosta konfiguracja do pisania i testowania usługi wyglądałaby następująco:
app.js
Spec: kontroler kotów
Spec: Cats Service
EDYCJA Na podstawie niektórych komentarzy zaktualizowałem moją odpowiedź, aby była nieco bardziej złożona, a także stworzyłem Plunkr demonstrujący testy jednostkowe. W szczególności jeden z komentarzy wspomniał „A co, jeśli usługa kontrolera sama ma prostą zależność, taką jak $ log?” - co jest zawarte w przykładzie z przypadkami testowymi. Mam nadzieję, że to pomoże! Przetestuj lub zhakuj planetę !!!
https://embed.plnkr.co/aSPHnr/
źródło
Musiałem przetestować dyrektywę, która wymagałaby innej dyrektywy, Google Places Autocomplete , debatowałem nad tym, czy powinienem z niej po prostu kpić ... i tak to zadziałało bez zgłaszania błędów dla dyrektywy, która wymagała gPlacesAutocomplete.
źródło
Jeśli chcesz przetestować kontroler, możesz wstrzyknąć i przetestować go jak poniżej.
źródło