Sinon: "TypeError: Não é possível ler a propriedade 'agora' de undefined" quando sinon.useFakeTimers ()

Criado em 5 jul. 2018  ·  15Comentários  ·  Fonte: sinonjs/sinon

Descreva o bug
Usando sinon @ 6.1.0 quando faço sinon.useFakeTimers() - recebi um erro:

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)

Quando eu faço o downgrade para sinon @ 5 - está tudo bem!

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

Contexto (preencha as seguintes informações):

  • Versão da biblioteca: 6.1.0
  • Ambiente: Ubuntu 16.04
  • URL de exemplo:
  • Outras bibliotecas que você está usando:

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

    • Webpack 4.15.1

Help wanted stale

Comentários muito úteis

@mroderick Eu criei um PR (# 1935) que implementa uma maneira de passar o contexto global por sinon.useFakeTimers , não sei se esse é o tipo de API que você tinha em mente, então fique à vontade para dar qualquer feedback !

Todos 15 comentários

O mesmo problema com [email protected] : decepcionado:
[email protected] funciona conforme o esperado

Um fenômeno curioso. Eu tentei replicar isso usando um projeto Angular vanilla e Sinon 6.1.0, mas useFakeTimers () não gera nenhum erro para mim, então pode ser algo no próprio ambiente do projeto.

Pela mensagem de erro, meu palpite é que essa variável se tornou indefinida de alguma forma.

@moraveyo , você acha que pode

Stack Overflow tem um guia sobre como criar um exemplo mínimo, completo e verificável

Não tenho muito tempo para isso agora, desculpe.

@mroderick Acabei de encontrar esse problema hoje. Aqui está um pequeno repositório que replica o problema: aqui .

O bug precisa de webpack e jsdom para aparecer. O stacktrace e alguma depuração mostram que o problema surge quando lolex tenta acessar _global.Date que não parece definido no window gerado por jsdom .

@LouisBrunner obrigado por criar um caso de teste executável e fácil de entender 👍

Executando o teste com test:node em seu repositório, ele falha conforme o esperado.
Quando executo o teste usando apenas mocha , ele passa conforme o esperado.

A linha que falha é lolex-src.js # L131 , assim como você concluiu com sua análise.

Como você concluiu, a causa raiz disso é que o objeto window fornecido por jsdom não fornece um objeto Date . lolex precisa ser capaz de fazer referência ao escopo global para funcionar corretamente, portanto, não podemos fazer alterações e fazer referência a Date diretamente.

lolex tem suporte para o cenário JSDOM, verifique o 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();

Podemos certamente melhorar lolex para lançar um erro descritivo quando suas suposições sobre o escopo global não forem atendidas e sugerir que o autor use withGlobal . Você gostaria de contribuir com uma solicitação de pull para isso?

@mroderick Que bom que o exemplo ajudou! 😃

Eu ficaria feliz em criar um PR, no entanto, isso só corrigirá lolex . Existe alguma maneira de fazer sinon.useFakeTimers funcionar neste cenário? Talvez adicionando um argumento como global a useFakeTimers que ele poderia usar para chamar withGlobal internamente?

Há alguma atualização sobre sinon.useFakeTimers trabalhar neste cenário. Ainda estou recebendo essa exceção ao usar mocha no jsDom

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

@LouisBrunner Gosto dessa ideia, acho que essa solução funcionaria para a maioria das pessoas 👍

@mroderick Eu criei um PR (# 1935) que implementa uma maneira de passar o contexto global por sinon.useFakeTimers , não sei se esse é o tipo de API que você tinha em mente, então fique à vontade para dar qualquer feedback !

Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.

Isso foi corrigido com # 1935

Estou usando o sinon 7.2.7 e quando tento usar sinon.useFakeTimers() obtive:

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

O mesmo.
Pode ser Babel 7? https://github.com/babel/babel/issues/8363

@ cichy380 e @axelhunn , poste um relatório de problema. Este problema foi corrigido.

Esta página foi útil?
0 / 5 - 0 avaliações