tutorial - Cómo probar con Jasmine un controlador AngularJS que llama al método de servicio que devuelve promesa
promesas angular 4 (1)
Estoy usando v1.2.0-rc.3 de AngularJS con el marco de prueba Jasmine.
Estoy tratando de afirmar que un controlador llama a un método de servicio. El método de servicio devuelve una promesa. El controlador se ve así:
angular.module(''test'', [])
.controller(''ctrl'', [''$scope'', ''svc'', function ($scope, svc) {
$scope.data = [];
svc.query()
.then(function (data) {
$scope.data = data;
});
}]);
Quiero probar que los datos se asignan al alcance cuando se resuelve el aplazamiento del método de servicio. He creado un simulacro para el servicio y la prueba de la unidad se ve así:
describe(''ctrl'', function () {
var ctrl, scope, svc, def, data = [{name: ''test''}];
beforeEach(module(''test''));
beforeEach(inject(function($controller, $rootScope, $q) {
svc = {
query: function () {
def = $q.defer();
return def.promise;
}
};
scope = $rootScope.$new();
controller = $controller(''ctrl'', {
$scope: scope,
svc: svc
});
}));
it(''should assign data to scope'', function () {
spyOn(svc, ''query'').andCallThrough();
deferred.resolve(data);
scope.$digest();
expect(svc.query).toHaveBeenCalled();
expect(scope.data).toBe(data);
});
});
Espero que se llame al método de consulta de svc, pero aparentemente no lo ha hecho.
Seguí this guía para burlarse de las promesas en las pruebas unitarias.
¿Qué estoy haciendo mal?
Parece que estaba colocando a mi espía en el lugar equivocado. Cuando lo coloco en el beforeEach, la prueba pasa.
beforeEach(inject(function($controller, $rootScope, $q) {
svc = {
query: function () {
def = $q.defer();
return def.promise;
}
};
spyOn(svc, ''query'').andCallThrough();
scope = $rootScope.$new();
controller = $controller(''ctrl'', {
$scope: scope,
svc: svc
});
}));