Usiamo il karma per testare i nostri servizi angolari, questi servizi contengono chiamate $ http, quindi abbiamo un $ httpbackend deriso sul posto in modo che possiamo eseguire l'app senza server e db. funziona bene, un servizio può chiamare $ http ("someurl? Id = 1234") e otteniamo i dati corretti.Servizio basato su promessa di prova angolare 1.1.5
Ma quando cerchiamo di fare la stessa cosa in unit test, non possiamo farlo funzionare, la promessa non si risolve, quando si tratta di $ http
Il servizio:
getAllowedTypes: function (contentId) {
var deferred = $q.defer();
$http.get(getChildContentTypesUrl(contentId))
.success(function (data, status, headers, config) {
deferred.resolve(data);
}).
error(function (data, status, headers, config) {
deferred.reject('Failed to retreive data for content id ' + contentId);
});
return deferred.promise;
}
Il $ schernito httpbackend
$httpBackend
.whenGET(mocksUtills.urlRegex('/someurl'))
.respond(returnAllowedChildren); //returns a json object and httpstatus:200
Il test
it('should return a allowed content type collection given a document id', function(){
var collection;
contentTypeResource.getAllowedTypes(1234).then(function(result){
collection = result;
});
$rootScope.$digest();
expect(collection.length).toBe(3);
});
ma la raccolta non è definito, .then() non viene mai chiamato.
provato praticamente di tutto per ottenere la promessa di risolvere, $ rootScope. $ Applicare(), $ digerire, $ httpBacke.flush(), ma nulla funziona
Così deriso $ httpBackend funziona quando viene chiamato dai controller in app, ma non quando i servizi vengono chiamati direttamente nei test dell'unità karma
Kees de Kooter ha fatto un commento in un'altra risposta di seguito che $ rootScope non è richiesto. Ho biforcato il plunkr e ho commentato tutti gli usi $ rootScope. Il test continua ancora: http://plnkr.co/edit/4ladJi7TAQ4sFdzuGmDr?p=preview – chashi