javascript - sombra - ¿Qué hace el jazmín que corre y espera?
jazmin del cabo sol o sombra (3)
Desde el sitio: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg
Jasmine llamará a los métodos run () y waitsFor () en el orden en que los pasaste. Tan pronto como el analizador JS llegue a un método waitsFor (), lo interrogará hasta que devuelva verdadero y solo así continuará con el siguiente método run ().
Esencialmente, las funciones run () y waitsFor () rellenan una matriz con sus funciones proporcionadas. La matriz se procesa luego mediante jamine, en la que las funciones se invocan secuencialmente. Se espera que las funciones registradas por run () realicen el trabajo real, mientras que las registradas por waitsFor () se espera que sean funciones de "bloqueo" y se sondearán (invocarán) cada 10 ms hasta que se vuelvan verdaderas o el período de tiempo de espera registrado opcional expire. Si el período de tiempo de espera expira, se informa un error utilizando el mensaje de error registrado opcional; de lo contrario, el proceso continúa con la siguiente función en la matriz. Presumiblemente, las expectativas dentro de las ejecuciones () también pueden desencadenar un informe de fallas (y tal vez incluso en las propias funciones de bloqueo).
La documentación es particularmente obtusa sobre estas características asíncronas.
Utilizo jasmine run y espero para probar operaciones asíncronas. Todo funciona bien, pero no estoy muy seguro de lo que sucede detrás de escena.
La documentación de jazmín indica el siguiente ejemplo al que agregué tres instrucciones de registro.
describe("Asynchronous specs", function() {
var value, flag;
it("should support async execution of test preparation and exepectations", function() {
runs(function() {
flag = false;
value = 0;
setTimeout(function() {
flag = true;
}, 500);
});
waitsFor(function() {
value++;
if(flag) {
console.log("A");
}
return flag;
}, "The Value should be incremented", 750);
console.log("B");
runs(function() {
console.log("C");
expect(value).toBeGreaterThan(0);
});
});
});
});
Las primeras runs
y waitsFor
son perfectamente claras para mí. Runs
inicia una operación asíncrona y espera a que espere una condición.
Sin embargo, no entiendo por qué la segunda waitsFor
no se inicia hasta que waitsFor
el waitsFor
. El waitsFor
no es una llamada de bloqueo.
Mi conjetura es que waitsFor
bloquea implícitamente cualquier llamada de waitsFor
siguiente hasta que finalice. ¿Esto es así?
Mi evidencia es que las declaraciones de console.log generan:
BAC
Pero si waitsFor
realmente bloquea, debería ser
A B C
La solución está en la documentación:
Varios bloques de ejecuciones () en una especificación se ejecutarán en serie. ( Documentación Jasmine )
waitsFor
bloquea hasta que se cumplan las condiciones que está esperando o se agote el tiempo de espera.
De los documentos de jasmine : "waitsFor () proporciona una mejor interfaz para pausar sus especificaciones hasta que se haya completado algún otro trabajo. Jasmine esperará hasta que la función provista devuelva true antes de continuar con el siguiente bloque".
Los documentos vinculados también tienen un ejemplo un poco más claro o waitsFor
.
EDIT : Ah, veo lo que quieres decir ahora. waitsFor
no bloqueará JS que no esté envuelto en runs
, waitsFor
, ect.
Lo que está haciendo jazmín es tomar la función que se le pasa a través de runs
o waitsFor
Si el jazmín no está esperando actualmente, ejecuta la función inmediatamente. Si está esperando, no lo llama hasta que termine de esperar.
Eso no detiene el console.log
ya que se ha pasado a jasmine, por lo que no puede evitar que se ejecute de inmediato.