Wir verwenden Karma zu Unit-Test unserer eckigen Dienste, diese Dienste enthält $ http Aufrufe, so haben wir ein verspottet $ httpbackend an Ort und Stelle, so dass wir die App ohne Server und db ausführen können. das funktioniert gut, ein Service kann $ http ("someurl? Id = 1234") aufrufen und wir bekommen die richtigen Daten zurück.Angular 1.1.5 test versprechen-based service
Aber wenn wir versuchen, die gleiche Sache in Unit-Tests zu tun, können wir es nicht funktioniert, löst das Versprechen bekommen, nie, wenn es um $ http
Der Service:
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;
}
Die verspottete $ httpbackend
$httpBackend
.whenGET(mocksUtills.urlRegex('/someurl'))
.respond(returnAllowedChildren); //returns a json object and httpstatus:200
Der 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);
});
aber Sammlung ist nicht definiert, .then() nie aufgerufen.
versuchte so ziemlich alles, was das Versprechen zu erhalten zu lösen, $ rootScope. $ Apply(), $ zu verdauen, $ httpBacke.flush(), aber nichts funktioniert
$ So verspottete httpBackend funktioniert, wenn von Controllern aufgerufen in App, aber nicht, wenn Dienste direkt in Karma-Unit-Tests aufgerufen werden
Kees de Kooter machte in einer anderen Antwort unten einen Kommentar, dass $ rootScope nicht benötigt wird. Ich gab den Plunkr auf und kommentierte alle $ rootScope-Verwendungen. Der Test läuft noch: http://plnkr.co/edit/4ladJi7TAQ4sFdzuGmDr?p=preview – chashi