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