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!
Contexte (veuillez compléter les informations suivantes):
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.
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 !