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!
Contexto (preencha as seguintes informações):
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.
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 !