tiempo script programacion pagina origen mostrar mientras funcion fallado ejecutar despues con cargar carga asincronia asincrona antes javascript unit-testing asynchronous jasmine karma-runner

javascript - script - mostrar loading mientras carga pagina jquery



Una prueba fallida hace que fallen otras pruebas asíncronas (2)

Al principio pensé que era un error, pero después de algunas investigaciones con los brillantes devtools de Chrome, parece que este es un comportamiento esperado, al menos por parte de Jasmine. Sin embargo, puede ser un error en el marco del Karma.

En resumen, el archivo node_modules/karma/static/debug.js (que es el archivo js para la página de depuración) tiene estas líneas (tengo Karma v1.7.0 ):

for (var i = 0; i < result.log.length; i++) { // Throwing error without losing stack trace (function (err) { setTimeout(function () { throw err }) })(result.log[i]) }

Si comenta la línea de lanzamiento y reinicia el servidor de karma, verá solo los mensajes de registro de la consola, que deberían esperarse: primero FAIL, luego PASS, y luego el resumen.

Verdaderamente, el error en Karma puede estar en su comportamiento para informar después de cada especificación.

Eso es lo que sucede aquí paso a paso (tengo la versión "jasmine-core": "^2.6.4" , al menos esto está en mi archivo package.json ):

  1. Jasmine ejecuta la primera especificación y falla;
  2. Karma informa sobre esto en el registro y agrega una función, que arroja un error a la pila (supongo que el lector conoce el modelo asíncrono en JavaScript, si no, entonces debe leer sobre esto en algo así como "JavaScript eficaz: 68 formas específicas" Aprovechar el poder de JavaScript "por David Herman , un verdadero libro de piedras preciosas, o en otro lugar). Además, esto es importante, aunque no estoy seguro, ya que no he investigado el código con tanta profundidad, registra una especie de "error global", ya que en el siguiente paso
  3. Jasmine ejecuta la segunda especificación y llama a la función getJasmineRequireObj().GlobalErrors ( jasmine.js:2204 ). Se detecta el "error global" y la especificación se convierte instantáneamente en un error. La espera asincrónica se agrega a la pila después de la función de Karma, la que arroja el error
  4. Luego, la primera función (que arroja el error) comienza la ejecución y agrega los throws. Esta función siempre se debug.js antes que la especificación asíncrona de Jasmine, ya que en debug.js no se pasa el tiempo a la llamada setTimeout :

    //notice the absent time argument setTimeout(function () { throw err })

  5. Jasmine ejecuta el assync espera de la segunda especificación y pasa

  6. Karma informa sobre la segunda especificación como una falla y agrega el lanzamiento de errores (si no está comentado, no se produce ningún error y pasa esta especificación) a la pila
  7. El segundo error de Karma es arrojado

Debajo hay capturas de pantalla con números, que puse para ilustrar los pasos de la lista:

with throw no se comentó en el archivo debug.js :

y con el throw comentado:

Tengo una configuración muy básica de karma / jazmín con un conjunto de pruebas que contiene dos pruebas. Espero que la primera prueba falle y la segunda prueba pase.

describe("The system", function() { it("should fail", function() { expect(true).toBe(false); }); it("should succeed", function(done) { setTimeout(function() { expect(1).toBe(1); done(); }, 10); }); });

Sin embargo, cuando ejecuto estas pruebas en el navegador y hago clic en el botón Depurar para abrir Karma DEBUG RUNNER , veo que ambas pruebas fallan y la segunda prueba falla con el mensaje de error de la primera prueba. La ejecución de prueba regular (es decir, no en el RASTREADOR DE DEPURACIÓN de Karma) funciona como se esperaba.

El mensaje de error para la segunda prueba es:

Uncaught Expected true to be false. at UserContext.<anonymous> (http://localhost:9876/base/workingspec.js:4:22) thrown

Cuando desactivo o elimino la primera prueba, pasa la segunda prueba.

¿Por qué ambas pruebas fallan en este caso? ¿Por qué falla la segunda prueba con el mensaje de error de la primera prueba?

Mi configuración de prueba contiene los siguientes paquetes / versiones:

+-- [email protected] +-- [email protected] +-- [email protected] +-- [email protected] `-- [email protected]


El problema está en el archivo Debug.js del Karma Debug Runner, como @ user907860 ya se insinuó. No es particular para Jasmine. He informado el problema y he creado una solución que acaba de fusionarse en la rama principal de Karma, por lo que la próxima versión debería solucionar este problema.