Używamy karmy do testowania naszych usług kątowych, usługi te zawierają połączenia HTTP http, więc mamy wyśmiewany $ HTTPbackend w miejscu, dzięki czemu możemy uruchomić aplikację bez serwera i db. działa to dobrze, usługa może zadzwonić do $ http ("someurl? Id = 1234") i otrzymujemy właściwe dane.Angular 1.1.5 testowa usługa oparta na obietnicy
Ale gdy staramy się zrobić to samo w testach jednostkowych, nie możemy zmusić go do pracy, obietnica nie rozwiązuje, gdy chodzi o $ http
usługę:
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;
}
szydzili $ httpbackend
$httpBackend
.whenGET(mocksUtills.urlRegex('/someurl'))
.respond(returnAllowedChildren); //returns a json object and httpstatus:200
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);
});
ale kolekcja jest niezdefiniowana, .then() nigdy nie jest wywoływana.
próbowałem prawie wszystko, aby uzyskać obietnicę rozwiązania, $ rootScope. $ Apply(), $ strawienia, $ httpBacke.flush(), ale nic nie działa
Tak szydzili $ httpBackend działa, gdy wywołana z kontrolerami w app, ale nie wtedy, gdy usługi są wywoływane bezpośrednio w testach jednostek karmy.
Kees de Kooter dodał komentarz w innej odpowiedzi poniżej, że $ rootScope nie jest wymagane. Rozwidłem plunkr i skomentowałem wszystkie zastosowania $ rootScope. Test nadal przebiega: http://plnkr.co/edit/4ladJi7TAQ4sFdzuGmDr?p=preview – chashi