Sinon: "TypeError: Eigenschaft 'now' von undefined kann nicht gelesen werden", wenn sinon.useFakeTimers ()

Erstellt am 5. Juli 2018  ·  15Kommentare  ·  Quelle: sinonjs/sinon

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!

Mein Repo:
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23

Kontext (bitte vervollständigen Sie die folgenden Informationen):

  • Bibliotheksversion: 6.1.0
  • Umgebung: Ubuntu 16.04
  • Beispiel-URL:
  • Andere Bibliotheken, die Sie verwenden:

    • "vue": "^ 2.5.16",

    • "vue-router": "^ 3.0.1"

    • "@ vue / cli-plugin-babel": "^ 3.0.0-beta.15",

    • "@ vue / cli-plugin-eslint": "^ 3.0.0-beta.15",

    • "@ vue / cli-plugin-unit-mocha": "^ 3.0.0-beta.15",

    • "@ vue / cli-service": "^ 3.0.0-beta.15",

    • "@ vue / eslint-config-airbnb": "^ 3.0.0-rc.3",

    • "@ vue / test-utils": "^ 1.0.0-beta.16",

    • "chai": "^ 4.1.2",

    • "vue-template-compiler": "^ 2.5.16"

    • Mokka 5.2.0

    • Webpack 4.15.1

Help wanted stale

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

Alle 15 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

NathanHazout picture NathanHazout  ·  3Kommentare

OscarF picture OscarF  ·  4Kommentare

kevinburkeshyp picture kevinburkeshyp  ·  4Kommentare

stephanwlee picture stephanwlee  ·  3Kommentare

optimatex picture optimatex  ·  4Kommentare