Sinon: "TypeError: No se puede leer la propiedad 'ahora' de undefined" cuando sinon.useFakeTimers ()

Creado en 5 jul. 2018  ·  15Comentarios  ·  Fuente: sinonjs/sinon

Describe el error
Usando sinon @ 6.1.0 cuando hago sinon.useFakeTimers() - recibí un error:

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)

Cuando cambio a sinon @ 5 , ¡todo está bien!

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

Contexto (complete la siguiente información):

  • Versión de la biblioteca: 6.1.0
  • Entorno: Ubuntu 16.04
  • URL de ejemplo:
  • Otras bibliotecas que está utilizando:

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

    • Mocha 5.2.0

    • Paquete web 4.15.1

Help wanted stale

Comentario más útil

@mroderick Creé un PR (# 1935) que implementa una forma de pasar el contexto global a través de sinon.useFakeTimers , no sé si ese es el tipo de API que tenías en mente, así que no dudes en darnos tu opinión. !

Todos 15 comentarios

Mismo problema con [email protected] : decepcionado:
[email protected] funciona como se esperaba

Un fenómeno curioso. Intenté replicar esto usando un proyecto vanilla Angular y Sinon 6.1.0, pero useFakeTimers () no arroja ningún error para mí, por lo que podría ser algo en el entorno del proyecto en sí.

Por el mensaje de error, supongo que esta variable se vuelve indefinida de alguna manera.

@moraveyo , ¿crees que puedes reducir esto a un ejemplo mínimo que muestre el problema?

Stack Overflow tiene una guía sobre cómo crear un ejemplo mínimo, completo y verificable

No tengo mucho tiempo para eso ahora, lo siento.

@mroderick Acabo de encontrar este problema hoy. Aquí hay un pequeño repositorio que replica el problema: aquí .

El error necesita tanto webpack como jsdom para aparecer. El seguimiento de pila y algo de depuración muestran que el problema surge cuando lolex intenta acceder a _global.Date que no parece estar configurado en el window generado por jsdom .

@LouisBrunner gracias por crear un caso de prueba ejecutable que es fácil de entender 👍

Al ejecutar la prueba con test:node en su repositorio, falla como se esperaba.
Cuando ejecuto la prueba usando solo mocha , pasa como se esperaba.

La línea que falla es lolex-src.js # L131 , tal como concluyó con su análisis.

Como concluyó, la causa principal de esto es que el objeto window proporcionado por jsdom no proporciona un objeto Date . lolex necesita poder hacer referencia al alcance global para funcionar correctamente, por lo que no podemos hacer cambios y hacer referencia a Date directamente.

lolex tiene soporte para el escenario JSDOM, consulte el 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();

Ciertamente podemos mejorar lolex para generar un error descriptivo cuando no se cumplen sus suposiciones sobre el alcance global, y sugerir que el autor use withGlobal . ¿Le gustaría contribuir con una solicitud de extracción para eso?

@mroderick ¡ Me alegro de que el ejemplo haya ayudado! 😃

Estaría feliz de crear un PR, sin embargo, eso solo arreglará lolex . ¿Hay alguna forma de hacer que sinon.useFakeTimers funcione en este escenario? ¿Quizás agregando un argumento como global a useFakeTimers que podría usar para llamar a withGlobal internamente?

¿Hay alguna actualización nueva sobre cómo conseguir que sinon.useFakeTimers funcione en este escenario? Sigo recibiendo esta excepción cuando uso mocha en jsDom

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

@LouisBrunner Me gusta esa idea, creo que esa solución funcionaría para la mayoría de la gente 👍

@mroderick Creé un PR (# 1935) que implementa una forma de pasar el contexto global a través de sinon.useFakeTimers , no sé si ese es el tipo de API que tenías en mente, así que no dudes en darnos tu opinión. !

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

Esto se ha corregido con # 1935

Estoy usando sinon 7.2.7 y cuando trato de usar sinon.useFakeTimers() obtuve:

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

Lo mismo.
¿Podría ser Babel 7? https://github.com/babel/babel/issues/8363

@ cichy380 y @axelhunn , publique un informe de problemas. Este problema está solucionado.

¿Fue útil esta página
0 / 5 - 0 calificaciones