javascript - Prueba asincrónica Jasmine
unit-testing jasmine2.0 (1)
Es porque está ejecutando su aserción tan pronto como se ha llamado a setTimeout
, por lo que no le está dando suficiente tiempo para invocar la devolución de llamada que establece el indicador en verdadero. El siguiente código funcionará (ejecute el siguiente código en TryJasmine para ver cómo se comporta):
describe(''flag delays'', function () {
it(''can set a flag after a delay'', function(done) {
var flag = false,
setFlag = function() {
//set the flag after a delay
setTimeout(function() {
flag = true;
expect(flag).toBe(true);
done();
}, 100);
};
setFlag();
});
});
En el futuro, Jasmine tiene un método waitsFor
para facilitar los temporizadores de prueba. Aún mejor, Sinon.JS proporciona funcionalidad para tiempos de falsificación , lo que permite omitir setTimeout
invocaciones de setTimeout
y verificar cualquier comportamiento sin crear dependencias basadas en la duración en sus pruebas. Además, podrás escribir afirmaciones al final de tus pruebas como hiciste en tu pregunta, lo que mejorará enormemente la legibilidad.
Estoy intentando probar un valor que se establece de forma asincrónica utilizando la nueva devolución de llamada done()
Jasmine 2.
Basé mi prueba en el ejemplo que da Jasmine en su documentación ( http://jasmine.github.io/2.0/upgrading.html#section-Asynchronous_Specs ):
it(''can set a flag after a delay'', function(done) {
var flag = false,
setFlag = function() {
//set the flag after a delay
setTimeout(function() {
flag = true;
done();
}, 100);
};
setFlag();
expect(flag).toBe(true);
});
Obtengo el resultado "Se esperaba que fuera falso", así que supongo que no está esperando que se invoque la devolución de llamada done () antes de comprobar el valor de la marca.
¿Alguien sabe por qué esta prueba está fallando?
¡Gracias!