Sinon: stubbing setImmediate de forma predeterminada conduce a un comportamiento no deseado

Creado en 7 ene. 2016  ·  4Comentarios  ·  Fuente: sinonjs/sinon

Me di cuenta de esto al tratar de averiguar por qué la hora del sistema fallaba al escribir csv. Resulta que la biblioteca tenía una llamada setImmediate que estaba bloqueando: https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18

Parece que hay un montón de bibliotecas que dependen de setImmediate para cosas inocuas, y que falsificar setImmediate conduce a un comportamiento inesperado en todas ellas:

¿Tal vez no sea razonable esperar que la hora del sistema no provoque un error en la escritura de csv? En este caso, es particularmente difícil de rastrear, porque en Javascript no puede simplemente presionar ctrl+c y obtener un seguimiento de la pila que le muestra qué salió mal. Tomó alrededor de 90 minutos identificar qué parte del código se estaba congelando y luego comprender por qué sinon era el responsable.

No estoy seguro de cuál debería ser la solución, pero parece estar afectando a muchas bibliotecas, y al menos una de ellas respondió creando su propia versión de setImmediate la que no se puede manipular.

Si la respuesta es que debería llamar a useFakeTimers(0, "Date") , ¿quizás esa debería ser la opción predeterminada? ¿Quizás eso encaja mejor con las expectativas de mi gente sobre cómo se comporta el mundo?

Comentario más útil

Para futuras referencias, esta forma de la función ahora le permite especificar qué funciones son falsificadas:

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);

Sets the clock start timestamp and names functions to fake.

Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.

Entonces esto resolvió el problema para mí cuando trabajaba con express:

clock = sinon.useFakeTimers(1495020000, 'Date');

Todos 4 comentarios

No estoy seguro de cuál debería ser la solución, pero parece estar afectando a muchas bibliotecas, y al menos una de ellas respondió creando su propia versión de setImmediate con la que no se puede alterar.

Esa es la solución recomendada para cuando usa setTimeout, setImmediate para obtener una nueva pila de llamadas (y no para controlar el tiempo).

https://github.com/taylorhakes/promise-polyfill/pull/15

Sí, acabo de pasar 90 minutos diagnosticando y arreglando esto en un código base comercial.

Como mínimo, los documentos deben mencionar que setImmediate será falsificado.

Para futuras referencias, esta forma de la función ahora le permite especificar qué funciones son falsificadas:

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...);

Sets the clock start timestamp and names functions to fake.

Possible functions are setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate and Date. Can also be called without the timestamp.

Entonces esto resolvió el problema para mí cuando trabajaba con express:

clock = sinon.useFakeTimers(1495020000, 'Date');

La documentación explica esto ahora: http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock--sinonusefaketimersnow-prop1-prop2-

¿Fue útil esta página
0 / 5 - 0 calificaciones