2014-09-19 14 views
7

Nel nostro progetto angularjs interno, uno dei servizi ha la chiamata $http.head() che sto tentando di testare.expectHEAD è documentato ma non implementato?

Per il test, sto usando Fake HTTP backend fornito da angular-mocks. Ecco il codice rilevante:

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(); 
})); 

esecuzione i risultati del test nel seguente errore:

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) 

Dopo aver scavato un po ', ho trovato il problema github rilevanti:

che, per quanto ho capito, significa che Non c'è davvero il metodo expectHEAD() in angock-mock: è documentato, ma, in realtà, non fa ancora parte di una versione angolare stabile.

Qual è il modo migliore per procedere?

Nota che devo stare con angolare < = 1.2, poiché questa applicazione deve essere eseguita su IE8 (Angular 1.3 è dropping support for IE8).


Una delle soluzioni che sto pensando al momento è quello di sostituire head() con get(). In questo caso, posso testarlo con il metodo esistente expectGET(). Ma non sono sicuro degli svantaggi.

risposta

2

Contrariamente al forking e alla modifica di una libreria, sarebbe molto meglio utilizzare il metodo sottostante.

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

L'altro metodo che non è possibile utilizzare è solo un metodo di scelta rapida. È molto meglio e più facile usare questo metodo che cambiare la libreria.

+0

Grazie, ha lavorato per me, questa è sicuramente un'opzione più facile qui. Anche se non sono del tutto d'accordo sul fatto che la risposta di @ dave merita un downvote - ha comunque cercato di aiutare e il suo approccio rimane legittimo. – alecxe

+0

Sì, è logico, sono ancora relativamente nuovo; Ho rimosso il mio voto negativo –

+0

Grazie per aver rimosso il downvote. Ho accettato la tua risposta dal momento che per prima cosa hai proposto la soluzione più semplice. Premiato con Dave per gli sforzi extra. Spero che ti sembri giusto. Grazie ancora. – alecxe

5

Si può solo aggiungere nel cambiare se stessi: https://github.com/revolunet/angular.js/commit/b2955dd52725241dd9519baa12fe8ca74659004b

Si tratta di un cambiamento di una riga in angolari-mocks.js on line 1523:

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

Visto che si deve stare con un non- versione corrente di Angular comunque, non dovrebbe causare troppi problemi in futuro.

Modifica: rivedere la risposta di JoelJeske, fa un buon punto: si potrebbe facilmente farlo senza forking. L'unico cambiamento che vorrei fare per la sua soluzione, è invece di chiamare il metodo direttamente

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

avrei invece creare il metodo di scelta rapida direttamente:

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

E poi si può fare:

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

Bene, questo è un cambiamento facile. Ma, cosa pensi che sarebbe un modo preferito per fare questo cambiamento: forchetta angock-mock e utilizzare la forcella? Grazie! – alecxe

+0

Forking è probabilmente il modo più semplice, sì. – dave

+0

Ho deciso di accettare la risposta di Joel, ma vi tengo la generosità. Spero che ti sembri giusto. Grazie ancora per l'aiuto! – alecxe

Problemi correlati