2013-06-26 15 views
5

Jestem początkującym programistą, który jest nowicjuszem zarówno w AngularJS, jak iw praktyce testów jednostkowych. Spędziłem wiele godzin próbując znaleźć rozwiązanie tego problemu, ale jestem coraz bardziej zdezorientowany. Gdyby ktoś mógł wskazać mi właściwy kierunek, bardzo bym to docenił. Postaram się być jak najbardziej opisowy.Jednostka Karma/Jasmine Testowanie usługi AngularJS z zależnościami

Sytuacja jest taka:

ja stworzyliśmy usługę w angularjs (Service), który ma kilka funkcji. Każda z tych funkcji wysyła żądanie HTTP GET do interfejsu API REST i zwraca obiekt obietnicy $ HTTP zawierający dane JSON. W ramach tych funkcji adres URL jest tworzony poprzez implementację kolejnej bardzo prostej usługi (usługa B), która została wprowadzona jako zależność do usługi A. Stworzyłem próbę usługi B, aby odizolować ją od wszystkich jej zależności. Obie te usługi są zdefiniowane wewnątrz tego samego modułu o nazwie "usługi". W tym przypadku nie ma rzeczywistej potrzeby tej zależności, ale chcę tylko zrozumieć, jak to działa.

Używając Jasmine, chciałbym skonstruować test jednostkowy dla Usługi A, aby upewnić się, że żądania wysyłane do API są poprawnie skonstruowane i prawdopodobnie, jeśli zwracane są prawidłowe dane JSON. W tym samym czasie nie chcę żadnych prawdziwych wywołań API.

To jest to, co wiem:

$ httpBackend mock to, czego potrzebuję, aby móc dokonać fałszywych połączeń do API i zapewnia funkcjonalność oczekiwać pewnych wniosków i powrotu określone rezultaty.

Muszę przetestować prawdziwą usługę A i wstrzyknąć sztuczkę, którą utworzyłem w usłudze B. Wiem, że są sposoby na to, używając Jasmine Spies i $ provide. Widziałem również przykłady użycia sinon.js i nie jestem pewien, które podejście jest najlepsze.


Będę umieszczać mój kod źródłowy poniżej, który jest napisany w CoffeeScript.

Service:

'use strict' 

angular.module("services") 
    .service("ServiceA", ["$http", "ServiceB", ($http, ServiceB) -> 

    #Uses underscore.js to set this default attribute 
    defaults = withCredentials:true 

    getVarset: (itemName, options={}) -> 
     options.method = "GET" 
     options.url = ServiceB.makeUrl("item/#{itemName}") 

     $http _.defaults(options, defaults) 

    getVarsets: (options = {}) -> 
     options.method = "GET" 
     options.url = ServiceB.makeUrl("items") 

     $http _.defaults(options, defaults) 

    getModelsForVarset: (itemName, options = {}) -> 
     options.method = "GET" 
     options.url = ServiceB.makeUrl("item/#{itemName}/prices") 

     $http _.defaults(options, defaults) 
    ]) 

Usługa B:

'use strict' 

angular.module('services') 
    .service 'ServiceB', [ -> 

    # Just return the string 
    # This service builds the real URL, but I've removed this 
    makeUrl: (Url) -> 
     "#{Url}" 
    ] 

Odpowiedz

4

więc mówisz, że wiesz, jak to zrobić z $ dostarczyć/szpiegów jaśminu i szukasz alternatywy ? Po prostu użyłem metody $ provide/spy dla szyderstwa i jak na razie bardzo dobrze mi się to udaje.

coś takiego:

beforeEach(function() { 

    // set up a default value for your mock 
    bMock = { 
     makeUrl: jasmine.createSpy('makeUrl() mock').andReturn('http://www....') 
    } 

    // use the $provide service to replace ServiceB 
    // with your mock 
    module('services', function($provide) { 
     $provide.value('ServiceB', bMock); 
    }); 

}); 

it('should do what its supposed to do', function() { 
    // test... 
}); 

następnie, jeśli chcesz użyć $ httpBackend mock żądań HTTP w służbie A, wystarczy skorzystać z usługi $ wtryskiwacza chwycić $ httpBackend, a następnie zadzwonić .Przy (...) aby skonfigurować, a la http://docs.angularjs.org/api/ngMock.$httpBackend

Powiązane problemy