2014-09-25 12 views
6

Tentativo di unità test in Karma con AngularMock se la mia funzione ha restituito una promessa che è stata respinta, ma non sembra trovare NULLA sorprendentemente in merito.AngularJS/Karma - La funzione di test restituisce la promessa che è stata risolta o respinta

Ho un servizio come UserService, che ha una funzione: processIdentityResponse che restituisce una promessa che è sia risolto o rifiutato a seconda della logica interna:

processIdentityResponse: function(response) 
{ 
    var deferred = $q.defer(); 
    if (response.data.banned) { 
     deferred.reject(response); 
    } else { 
     deferred.resolve(response); 
    } 
    return deferred.promise; 
} 

voglio provare che, se la proprietà vietato esiste poi viene restituita una promessa respinta e, in caso contrario, che è stata risolta ... come posso ottenere questo?

ho provato qualcosa di simile a quanto segue per senza successo:

it('should return a rejected promise if status is a string', function() { 
    var rejected = false; 
    UserService.processIdentityResponse(data).catch(function() { 
     rejected = true; 
    }); 
    expect(rejected).toBe(true); 
}); 

risposta

6

Sembra che il motivo è perché la promessa non era ancora risolto in quanto è la funzionalità asincrona.

Che, fondamentalmente, devono $rootScope.$digest() seguito in questo modo:

it('should return a rejected promise if status is a string', inject(function($rootScope) { 
    var rejected = false; 
    UserService.processIdentityResponse(data).catch(function() { 
     rejected = true; 
    }); 
    $rootScope.$digest(); 
    expect(rejected).toBe(true); 
})); 
+0

Trovo piuttosto bizzarro usare scope su un servizio. Sembra riservato per direttive e controller. – trysis

+0

@trysis come faresti a testare le promesse? Mi piacerebbe vedere la strada senza chiamare '$ rootScope. $ Digest()' –

+0

Non stavo contestando l'utilità o la necessità, solo affermando che sembra strano. I servizi dovrebbero essere completamente isolati dalla logica DOM e '$ scope' /' $ rootScope' sono piuttosto legati al DOM, anche se alcuni dei loro metodi, come '$ digest', non hanno bisogno di esserlo. – trysis

1

da aggiungere a quanto ha detto Dominic, ho usato Jasiminedone() funzione asincrona di sostegno. Pensala come una pausa/attesa.

describe('my description',function(){ 
beforeEach(function(done){ 
    var rejected = true; 
    var promise = UserService.processIdentityResponse(data);//add ur service or function that will return a promise here 
    setTimeout(function(){done();},1500);//set time to 1500ms or more if it's a long request 
}); 

it('it should be true',function(done){ 
    promise.catch(function(){ rejected=true}); 
    $rootScope.$digest();//important 
    expect(rejected).toBeTruthy(); 
    done(); 
}); 
}); 
Problemi correlati