Ich bemerkte dies, als ich versuchte herauszufinden, warum das Stubben der Systemzeit dazu führte, dass das CSV-Schreiben fehlschlug. Es stellt sich heraus, dass die Bibliothek einen setImmediate
-Aufruf hatte, der blockierte: https://github.com/C2FO/fast-csv/blob/master/lib/extended.js#L18
Es scheint, als gäbe es eine Reihe von Bibliotheken, die sich für harmlose Dinge auf setImmediate
verlassen, und dass das Fälschen setImmediate
bei allen zu unerwartetem Verhalten führt:
Vielleicht ist es unvernünftig zu erwarten, dass das Stubben der Systemzeit nicht dazu führt, dass das CSV-Schreiben fehlschlägt? In diesem Fall ist es besonders schwierig aufzuspüren, weil man in Javascript nicht einfach ctrl+c
und einen Stack-Trace bekommen kann, der einem zeigt, was schief gelaufen ist. Es dauerte ungefähr 90 Minuten, um zu identifizieren, welcher Teil des Codes einfrierte, und dann zu verstehen, warum Sinon dafür verantwortlich war.
Ich bin mir nicht sicher, was das Update sein sollte, aber es scheint viele Bibliotheken zu betreffen, und mindestens eine von ihnen hat reagiert, indem sie eine eigene Version von setImmediate
erstellt hat, mit der nicht manipuliert werden kann.
Wenn die Antwort lautet, ich sollte useFakeTimers(0, "Date")
anrufen, sollte das vielleicht die Standardeinstellung sein? Vielleicht passt das besser zu den Erwartungen meiner/der Leute, wie sich die Welt verhält?
Ich bin mir nicht sicher, was das Update sein sollte, aber es scheint viele Bibliotheken zu betreffen, und mindestens eine von ihnen hat reagiert, indem sie eine eigene Version von setImmediate erstellt hat, mit der nicht manipuliert werden kann.
Dies ist die empfohlene Lösung, wenn Sie setTimeout, setImmediate verwenden, um einen neuen Aufrufstapel zu erhalten (und nicht um die Zeit zu steuern).
Ja, ich habe gerade 90 Minuten damit verbracht, dies in einer kommerziellen Codebasis zu diagnostizieren und zu beheben.
Zumindest sollten die Dokumente erwähnen, dass setImmediate gefälscht wird.
Für die Zukunft können Sie mit dieser Form der Funktion jetzt angeben, welche Funktionen gefälscht sind:
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.
Das hat das Problem für mich bei der Arbeit mit Express gelöst:
clock = sinon.useFakeTimers(1495020000, 'Date');
Die Dokumentation erklärt dies jetzt: http://sinonjs.org/releases/v2.3.2/fake-timers/#var -clock--sinonusefaketimersnow-prop1-prop2-
Hilfreichster Kommentar
Für die Zukunft können Sie mit dieser Form der Funktion jetzt angeben, welche Funktionen gefälscht sind:
Das hat das Problem für mich bei der Arbeit mit Express gelöst: