Beschreibe den Fehler
Verwenden von sinon @ 6.1.0, wenn ich sinon.useFakeTimers()
mache - Ich habe eine Fehlermeldung erhalten:
TypeError: Cannot read property 'now' of undefined
at mirrorDateProperties (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3644:1)
at hijackMethod (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3947:1)
at Object.install (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4337:1)
at useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4385:1)
at Sandbox.useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:15390:1)
at Context.<anonymous> (dist/webpack:/tests/unit/Countdown.spec.js:23:1)
Wenn ich auf sinon @ 5 herunterstufte, ist alles in Ordnung!
Kontext (bitte vervollständigen Sie die folgenden Informationen):
Gleiches Problem mit [email protected]
: enttäuscht:
[email protected]
funktioniert wie erwartet
Ein merkwürdiges Phänomen. Ich habe versucht, dies mit einem Vanilla Angular-Projekt und Sinon 6.1.0 zu replizieren, aber useFakeTimers () wirft keine Fehler für mich aus, sodass es möglicherweise etwas in der Projektumgebung selbst ist.
Aus der Fehlermeldung geht hervor, dass diese Variable irgendwie undefiniert wird.
@moraveyo Glaubst du, du kannst das auf ein minimales Beispiel
Der Stapelüberlauf enthält eine Anleitung zum Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels
Ich habe jetzt nicht viel Zeit dafür, sorry.
@mroderick Ich bin heute auf dieses Problem gestoßen. Hier ist ein kleines Repository, das das Problem repliziert: hier .
Der Fehler benötigt sowohl webpack
als auch jsdom
, um angezeigt zu werden. Die Stacktrace und einige Debuggen zeigen das Problem auftreten , wenn lolex
versucht, zuzugreifen _global.Date
, die nicht auf dem Set zu sein scheinen window
, die von jsdom
.
@ LouisBrunner, vielen Dank, dass Sie einen ausführbaren Testfall erstellt haben, der leicht zu verstehen ist 👍
Das Ausführen des Tests mit test:node
in Ihrem Repository schlägt wie erwartet fehl.
Wenn ich den Test mit nur mocha
ausführe, besteht er wie erwartet.
Die fehlgeschlagene Zeile lautet
Wie Sie festgestellt haben, ist die Hauptursache dafür, dass das von jsdom
bereitgestellte window
-Objekt kein Date
-Objekt bereitstellt. lolex
muss in der Lage sein, auf den globalen Bereich zu verweisen, damit er ordnungsgemäß funktioniert. Daher können wir keine Änderungen vornehmen und Date
direkt referenzieren.
lolex
unterstützt das JSDOM-Szenario. Schauen Sie sich die lolex.withGlobal
// create a lolex implementation using node's `global`
const lolex = require("lolex").withGlobal(global);
const clock = lolex.install();
setTimeout(fn, 15); // Schedules with clock.setTimeout
clock.uninstall();
Wir können sicherlich lolex
verbessern, um einen beschreibenden Fehler auszulösen, wenn seine Annahmen über den globalen Umfang nicht erfüllt sind, und vorschlagen, dass der Autor withGlobal
. Möchten Sie dazu eine Pull-Anfrage einreichen?
@mroderick Ich bin froh, dass das Beispiel geholfen hat! 😃
Ich würde gerne eine PR erstellen, aber das wird nur lolex
reparieren. Gibt es eine Möglichkeit, sinon.useFakeTimers
in diesem Szenario zum Laufen zu bringen? Vielleicht durch Hinzufügen eines Arguments wie global
zu useFakeTimers
, das verwendet werden könnte, um withGlobal
intern aufzurufen?
Gibt es neue Updates, um sinon.useFakeTimers
in diesem Szenario zum Laufen zu bringen? Ich bekomme immer noch diese Ausnahme, wenn ich Mokka in jsDom verwende
Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)
@ LouisBrunner Ich mag diese Idee, ich denke, dass die Lösung für die meisten Menschen funktionieren würde 👍
@mroderick Ich habe eine PR (# 1935) erstellt, die eine Möglichkeit implementiert, den globalen Kontext durch sinon.useFakeTimers
leiten. Ich weiß nicht, ob dies die Art von API ist, an die Sie
Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivitäten gab. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.
Dies wurde mit # 1935 behoben
Ich benutze Sinon 7.2.7 und wenn ich versuche, sinon.useFakeTimers()
ich:
TypeError: Cannot set property performance of #<Window> which has only a getter
Das gleiche.
Könnte Babel 7 sein? https://github.com/babel/babel/issues/8363
@ cichy380 und @axelhunn , bitte posten Sie einen
Hilfreichster Kommentar
@mroderick Ich habe eine PR (# 1935) erstellt, die eine Möglichkeit implementiert, den globalen Kontext durch
sinon.useFakeTimers
leiten. Ich weiß nicht, ob dies die Art von API ist, an die Sie