javascript - run - test service angular 4
Pruebas unitarias de un servicio asÃncrono en angularjs. (2)
En primer lugar, el setTimeout
es particularmente difícil de probar ya que es difícil burlarse. Afortunadamente, AngularJS tiene una envoltura alrededor ( $timeout
) que cumple la misma función pero que puede ser burlado fácilmente:
ls.DoIt = function() {
var deferred = $q.defer();
$timeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
El simulacro provisto para $timeout
nos permite simular fácilmente el tiempo transcurrido (con $timeout.flush()
), lo que significa que nuestras pruebas pueden ejecutarse rápidamente, sin esperar realmente a que se complete el evento async (tenga en cuenta que el código de producción todavía está usando async API!).
Las pruebas cambiadas se verían así:
it("should equal 5", inject(function(myservice, $timeout) {
var valueToVerify;
myservice.DoIt().then(function(returned) {
valueToVerify = returned;
});
$timeout.flush();
expect(valueToVerify).toEqual(5);
}));
Y, finalmente, el jsFiddle de trabajo: http://jsfiddle.net/v9L9G/1/
Estoy intentando probar un servicio que tiene métodos asíncronos, pero no tengo suerte.
He intentado implementar con promesas utilizando el soporte $ q en angularjs.
Cualquier ayuda sería apreciada.
angular.module(''myapp'', [''myservice'']);
angular.module(''myservice'', []).factory(''myservice'', function($q) {
var ls = {};
ls.DoIt = function() {
var deferred = $q.defer();
setTimeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
return ls;
});
describe(''services'', function () {
beforeEach(module(''myservice''));
it("should equal 2", inject(function(myservice) {
myservice.DoIt().then(function(returned) {
expect(returned).toEqual(2);
});
}));
});
No está relacionado con Angular en sí, sino con las pruebas asíncronas de Jasmine .
Si necesita un setTimeout
use Angular $timeout
. Y si desea tener un control preciso sobre las ejecuciones de tiempo de espera de setTimeout / $, use el Reloj simulado.