Sinon: stub setImediate por padrão leva a um comportamento indesejável

Criado em 7 jan. 2016  ·  4Comentários  ·  Fonte: sinonjs/sinon

Percebi isso enquanto tentava descobrir por que o stubbing da hora do sistema causou a falha na gravação do csv. Acontece que a biblioteca tinha uma chamada setImmediate que estava bloqueando: https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18

Parece que há um monte de bibliotecas que dependem de setImmediate para coisas inócuas, e que fingir setImmediate leva a um comportamento inesperado em todas elas:

Talvez não seja razoável esperar que stubbing a hora do sistema não cause falha na gravação de csv? Nesse caso, é particularmente difícil rastrear, porque em Javascript você não pode simplesmente clicar ctrl+c e obter um rastreamento de pilha mostrando o que deu errado. Demorou cerca de 90 minutos apenas para identificar qual parte do código estava congelando e depois entender por que a sinon era responsável.

Não tenho certeza de qual deveria ser a correção, mas parece estar afetando muitas bibliotecas, e pelo menos uma delas respondeu criando sua própria versão de setImmediate que não pode ser alterada.

Se a resposta for que eu deveria estar chamando useFakeTimers(0, "Date") , talvez esse deva ser o padrão? Talvez isso se encaixe melhor com as expectativas do meu/das pessoas de como o mundo se comporta?

Comentários muito úteis

Para referência futura, esta forma da função agora permite especificar quais funções são 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.

Então isso resolveu o problema para mim ao trabalhar com express:

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

Todos 4 comentários

Não tenho certeza de qual deveria ser a correção, mas parece estar afetando muitas bibliotecas, e pelo menos uma delas respondeu criando sua própria versão do setImmediate que não pode ser desmontada.

Essa é a solução recomendada para quando você estiver usando setTimeout, setImmediate para efeito de obter uma nova pilha de chamadas (e não para controlar o tempo).

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

Sim, acabei de passar 90 minutos diagnosticando e corrigindo isso em uma base de código comercial.

No mínimo, os documentos devem mencionar que setImmediate será falsificado.

Para referência futura, esta forma da função agora permite especificar quais funções são 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.

Então isso resolveu o problema para mim ao trabalhar com express:

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

A documentação explica isso agora: http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock--sinonusefaketimersnow-prop1-prop2-

Esta página foi útil?
0 / 5 - 0 avaliações