Sinon: "TypeError: Impossible de lire la propriété 'now' de undefined" quand sinon.useFakeTimers ()

Créé le 5 juil. 2018  ·  15Commentaires  ·  Source: sinonjs/sinon

Décrivez le bogue
En utilisant sinon @ 6.1.0 quand je fais sinon.useFakeTimers() - j'ai une erreur:

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)

Quand je rétrograde à sinon @ 5 - tout va bien!

Mon dépôt:
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23

Contexte (veuillez compléter les informations suivantes):

  • Version de la bibliothèque: 6.1.0
  • Environnement: Ubuntu 16.04
  • Exemple d'URL:
  • Autres bibliothèques que vous utilisez:

    • "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"

    • Moka 5.2.0

    • Webpack 4.15.1

Help wanted stale

Commentaire le plus utile

@mroderick J'ai créé un PR (# 1935) qui implémente un moyen de transmettre le contexte global via sinon.useFakeTimers , je ne sais pas si c'est le genre d'API que vous aviez en tête, alors n'hésitez pas à donner vos commentaires !

Tous les 15 commentaires

Même problème avec [email protected] : déçu:
[email protected] fonctionne comme prévu

Un phénomène curieux. J'ai essayé de reproduire cela en utilisant un projet Angular vanilla et Sinon 6.1.0, mais useFakeTimers () ne génère aucune erreur pour moi, donc cela pourrait être quelque chose dans l'environnement du projet lui-même.

D'après le message d'erreur, je suppose que cette variable devient indéfinie d'une manière ou d'une autre.

@moraveyo pensez -vous que vous pouvez résumer cela à un exemple minimal qui montre le problème?

Stack Overflow a un guide sur la façon de créer un exemple minimal, complet et vérifiable

Je n'ai pas beaucoup de temps pour ça maintenant, désolé.

@mroderick Je viens de rencontrer ce problème aujourd'hui. Voici un petit référentiel qui reproduit le problème: ici .

Le bogue a besoin à la fois de webpack et de jsdom pour apparaître. Le stacktrace et quelques débogages montrent que le problème survient lorsque lolex essaie d'accéder à _global.Date qui ne semble pas défini sur le window généré par jsdom .

@LouisBrunner merci d'avoir créé un cas de test

En exécutant le test avec test:node dans votre référentiel, il échoue comme prévu.
Lorsque j'exécute le test en utilisant seulement mocha , il passe comme prévu.

La ligne qui échoue est lolex-src.js # L131 , comme vous l'avez conclu avec votre analyse.

Comme vous l'avez conclu, la cause première de ceci est que l'objet window fourni par jsdom ne fournit pas d'objet Date . lolex doit pouvoir référencer la portée globale pour fonctionner correctement, nous ne pouvons donc pas faire de changements et référencer Date directement.

lolex prend en charge le scénario JSDOM, consultez le 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();

Nous pouvons certainement améliorer lolex pour lancer une erreur descriptive lorsque ses hypothèses sur la portée globale ne sont pas satisfaites, et suggérer que l'auteur utilise withGlobal . Souhaitez-vous contribuer à une pull request pour cela?

@mroderick Heureux que l'exemple ait aidé! 😃

Je serais heureux de créer un PR, mais cela ne résoudra que lolex . Existe-t-il un moyen de faire fonctionner sinon.useFakeTimers dans ce scénario? Peut-être en ajoutant un argument comme global à useFakeTimers qu'il pourrait utiliser pour appeler withGlobal interne?

Y a-t-il de nouvelles mises à jour sur get sinon.useFakeTimers pour fonctionner dans ce scénario. Je reçois toujours cette exception lors de l'utilisation de mocha dans jsDom

Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)

@LouisBrunner J'aime cette idée, je pense que cette solution fonctionnerait pour la plupart des gens 👍

@mroderick J'ai créé un PR (# 1935) qui implémente un moyen de transmettre le contexte global via sinon.useFakeTimers , je ne sais pas si c'est le genre d'API que vous aviez en tête, alors n'hésitez pas à donner vos commentaires !

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

Ce problème a été corrigé avec # 1935

J'utilise sinon 7.2.7 et quand j'essaye d'utiliser sinon.useFakeTimers() j'ai:

TypeError: Cannot set property performance of #<Window> which has only a getter

Le même.
Pourrait être Babel 7? https://github.com/babel/babel/issues/8363

@ cichy380 et @axelhunn , veuillez publier un rapport de problème. Ce problème est résolu.

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