angularjs karma-runner

angularjs - Angular 1.1.5 prueba basada en promesa de servicio



karma-runner (3)

Usamos karma para realizar pruebas unitarias de nuestros servicios angulares, estos servicios contienen llamadas $ http, por lo que tenemos un $ httpbackend simulado en su lugar para que podamos ejecutar la aplicación sin servidor y db. esto funciona bien, un servicio puede llamar a $ http ("someurl? id = 1234") y obtenemos la información correcta.

Pero cuando intentamos hacer lo mismo en las pruebas unitarias, no podemos hacer que funcione, la promesa nunca se resuelve, cuando involucra $ http

El servicio:

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

El $ httpbackend burlado

$httpBackend .whenGET(mocksUtills.urlRegex(''/someurl'')) .respond(returnAllowedChildren); //returns a json object and httpstatus:200

La prueba

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

pero la colección no está definida, .then () nunca se llama.

probé casi todo para obtener la promesa de resolver, $ rootScope. $ apply (), $ digest, $ httpBacke.flush (), pero nada funciona

Así, el $ httpBackend simulado funciona cuando se llama desde los controladores en la aplicación, pero no cuando los servicios se llaman directamente en las pruebas de unidad de karma


En su caso, tiene que digerir $ dos veces, una vez por $ httpBackend, y nuevamente por su propio aplazamiento.

Asi que:

it(''should return a allowed content type collection given a document id'', function(){ var collection; contentTypeResource.getAllowedTypes(1234).then(function(result){ collection = result; }); $httpBackend.flush(); $rootScope.$digest(); expect(collection.length).toBe(3); });


No debería necesitar digerir dos veces, ya que $ httpBackend.flush () llama a digerir. Debe realizar la llamada, el resumen de la llamada para resolver los interceptores de solicitud, la llamada al vaciar.

Aquí hay un Plnkr de trabajo: http://plnkr.co/edit/FiYY1jT6dYrDhroRpFG1?p=preview


Ya casi estás ahí. En su caso, solo necesita forzar un ciclo de resumen antes de vaciar el backend HTTP. Ver código de ejemplo a continuación.

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(); $httpBackend.flush(); expect(collection.length).toBe(3); });