2014-09-19 19 views
7

W naszym wewnętrznym projekcie angularjs jedna z usług ma wywołanie $http.head(), które próbuję przetestować.expectHEAD jest udokumentowany, ale nie zaimplementowany?

Do testowania używam Fake HTTP backend dostarczonego przez angular-mocks. Oto odpowiedni kod:

it('handle status code 200', inject(function ($httpBackend, ConnectionService) { 
    spyOn(Math, 'random').andReturn(0.1234); 

    httpBackend = $httpBackend; 
    httpBackend.expectHEAD('ping?rand=1234').respond(200); 
    ConnectionService.sendRequest(); 
    httpBackend.flush(); 

    expect(ConnectionService.stats.packetsReceived).toEqual(5); 

    httpBackend.verifyNoOutstandingExpectation(); 
    httpBackend.verifyNoOutstandingRequest(); 
})); 

Running wyniki testu do następującego błędu:

PhantomJS 1.9.7 (Mac OS X) connection service tests sendRequest function handle status code 200 
FAILED TypeError: 'undefined' is not a function (evaluating 'httpBackend.expectHEAD('ping?rand=1234')') 
at /path/to/app/app-connection-service_test.js:66 
at d (/path/to/app/bower_components/angular/angular.min.js:35) 
at workFn (/path/to/app/bower_components/angular-mocks/angular-mocks.js:2159) 

po wykopaniu trochę, znalazłem odpowiedni problem GitHub:

co, o ile rozumiem, oznacza t naprawdę nie jest to metoda expectHEAD() w makietach kątowych - jest udokumentowana, ale w rzeczywistości nie jest jeszcze częścią stabilnego wydania kątowego.

Jaki jest najlepszy sposób postępowania?

Zauważ, że muszę pozostać pod kątem < = 1,2, ponieważ ta aplikacja musi działać na IE8 (Angular 1.3 to dropping support for IE8).


Jednym z obejścia myślę o aktualnie jest zastąpienie head() z get(). W takim przypadku mogę przetestować go za pomocą istniejącej metody expectGET(). Ale nie jestem pewien na temat wad.

Odpowiedz

2

W przeciwieństwie do rozwidlania i edycji biblioteki, lepszym sposobem byłoby użycie metody bazowej.

$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200); 

Inną metodą, której nie można użyć, jest tylko metoda skrótu. Używanie tej metody jest o wiele lepsze i łatwiejsze niż zmiana biblioteki.

+0

Dziękuję, pracowałeś dla mnie, to zdecydowanie łatwiejsza opcja tutaj. Chociaż nie całkiem zgadzam się, że odpowiedź @ dave'a zasługuje na lekcję - nadal próbował pomóc, a jego podejście pozostaje uzasadnione. – alecxe

+0

Tak, to ma sens, wciąż jestem nowy stosunkowo nowy; Usunąłem mój głos w dół –

+0

Dziękuję za usunięcie orzeczenia. Przyjąłem twoją odpowiedź, odkąd pierwszy zaproponowałeś łatwiejsze rozwiązanie. Przyznano nagrodę Dave'owi za dodatkowe wysiłki. Mam nadzieję, że wydaje ci się sprawiedliwa. Dzięki jeszcze raz. – alecxe

5

może po prostu włożyć w zmianę siebie: https://github.com/revolunet/angular.js/commit/b2955dd52725241dd9519baa12fe8ca74659004b

Jest to zmiana o jedną linię w skośnych mocks.js on line 1523:

1523: - angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) { 
1523: + angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {  

skoro trzeba zatrzymać się z nie- obecna wersja Angulara i tak nie powinna powodować zbyt wielu problemów w przyszłości.

Edytowanie: przegląd odpowiedzi JoelJeske, on robi dobry punkt - można to łatwo zrobić bez rozwidlenia. Jedna zmiana chciałbym zrobić do jego rozwiązania, to zamiast wywoływania metody bezpośrednio

$httpBackend.expect('HEAD', 'ping?rand=1234').respond(200); 

bym zamiast stworzyć metodę skrótu bezpośrednio:

$httpBackend.expectHEAD = function(url, headers) { 
    return $httpBackend.expect('HEAD', url, undefined, headers); 
}; 

A potem można zrobić:

$httpBackend.expectHEAD('ping?rand=1234').respond(200); 
+0

Dobrze, że to łatwa zmiana. Ale jak myślisz, jaki byłby preferowany sposób dokonania tej zmiany: widelec kątowy i używać widelca? Dziękuję Ci! – alecxe

+0

Rozwidlenie to prawdopodobnie najłatwiejszy sposób, tak. – dave

+0

Postanowiłem zaakceptować odpowiedź Joela, ale przyznać nagrodę. Mam nadzieję, że wydaje ci się sprawiedliwa. Jeszcze raz dziękuję za pomoc! – alecxe

Powiązane problemy