Sinon: le remplacement de setImmediate par défaut conduit à un comportement indésirable

Créé le 7 janv. 2016  ·  4Commentaires  ·  Source: sinonjs/sinon

J'ai remarqué cela en essayant de comprendre pourquoi le remplacement de l'heure système provoquait l'échec de l'écriture csv. Il s'avère que la bibliothèque avait un appel setImmediate qui bloquait : https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18

Il semble qu'il existe un tas de bibliothèques qui s'appuient sur setImmediate pour des choses anodines, et que simuler setImmediate conduit à un comportement inattendu dans chacune d'elles :

Peut-être est-il déraisonnable de s'attendre à ce que le remplacement de l'heure système ne provoque pas l'échec de l'écriture csv? Dans ce cas, il est particulièrement difficile à retrouver, car en Javascript, vous ne pouvez pas simplement appuyer sur ctrl+c et obtenir une trace de la pile vous indiquant ce qui n'a pas fonctionné. Il a fallu environ 90 minutes pour identifier quelle partie du code était gelée, puis pour comprendre pourquoi sinon était responsable.

Je ne sais pas quel devrait être le correctif, mais il semble affecter de nombreuses bibliothèques, et au moins l'une d'entre elles a répondu en créant sa propre version de setImmediate qui ne peut pas être mutilée.

Si la réponse est que je devrais appeler useFakeTimers(0, "Date") , peut-être que cela devrait être la valeur par défaut ? Peut-être que cela correspond mieux à mes attentes/à celles des gens quant à la façon dont le monde se comporte ?

Commentaire le plus utile

Pour référence future, cette forme de la fonction vous permet désormais de spécifier quelles fonctions sont truquées :

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.

Donc, cela a résolu le problème pour moi lorsque je travaillais avec express:

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

Tous les 4 commentaires

Je ne sais pas quel devrait être le correctif, mais il semble affecter de nombreuses bibliothèques, et au moins l'une d'entre elles a répondu en créant sa propre version de setImmediate qui ne peut pas être modifiée.

C'est la solution recommandée lorsque vous utilisez setTimeout, setImmediate pour obtenir une nouvelle pile d'appels (et non pour contrôler le temps).

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

Oui, je viens de passer 90 minutes à diagnostiquer et à corriger cela dans une base de code commerciale.

À tout le moins, la documentation devrait mentionner que setImmediate sera falsifié.

Pour référence future, cette forme de la fonction vous permet désormais de spécifier quelles fonctions sont truquées :

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.

Donc, cela a résolu le problème pour moi lorsque je travaillais avec express:

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

La documentation explique cela maintenant : http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock--sinonusefaketimersnow-prop1-prop2-

Cette page vous a été utile?
0 / 5 - 0 notes