Sinon: Stubbing setImmediate führt standardmäßig zu unerwünschtem Verhalten

Erstellt am 7. Jan. 2016  ·  4Kommentare  ·  Quelle: sinonjs/sinon

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?

Hilfreichster Kommentar

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');

Alle 4 Kommentare

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).

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

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-

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen