Опишите ошибку
Используя sinon @ 6.1.0, когда я делаю sinon.useFakeTimers()
- я получил ошибку:
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)
При переходе на sinon @ 5 - все в порядке!
Контекст (просьба заполнить следующую информацию):
Та же проблема с [email protected]
: разочарован:
[email protected]
работает должным образом
Любопытное явление. Я попытался воспроизвести это, используя ванильный проект Angular и Sinon 6.1.0, но useFakeTimers () не вызывает у меня никаких ошибок, так что это может быть что-то в самой среде проекта.
Судя по сообщению об ошибке, эта переменная каким-то образом становится неопределенной.
@moraveyo, как вы думаете, можно
В Stack Overflow есть руководство о том, как создать минимальный, полный и проверяемый пример.
У меня сейчас мало на это времени, извините.
@mroderick Я только что столкнулся с этой проблемой сегодня. Вот небольшой репозиторий, который воспроизводит проблему: здесь .
Для обнаружения ошибки требуется как webpack
и jsdom
. Трассировка стека и некоторая отладка показывают, что проблема возникает, когда lolex
пытается получить доступ к _global.Date
который, похоже, не установлен в window
созданном jsdom
.
@LouisBrunner благодарим вас за создание работоспособного тестового примера, который легко понять
Запуск теста с test:node
в вашем репозитории завершился ошибкой, как и ожидалось.
Когда я запускаю тест, используя только mocha
, он проходит, как ожидалось.
Строка, которая терпит неудачу, называется lolex-src.js # L131 , как вы и закончили своим анализом.
Как вы сделали вывод, основная причина этого заключается в том, что объект window
предоставленный jsdom
, не предоставляет объект Date
. lolex
должен иметь возможность ссылаться на глобальную область видимости для правильной работы, поэтому мы не можем вносить изменения и напрямую ссылаться на Date
.
lolex
поддерживает сценарий JSDOM, ознакомьтесь с 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();
Мы, безусловно, можем улучшить lolex
чтобы выдавать описательную ошибку, когда его предположения о глобальной области не выполняются, и предложить автору использовать withGlobal
. Вы бы хотели внести для этого пул-реквест?
@mroderick Рад, что пример помог! 😃
Я был бы счастлив создать PR, однако это исправит только lolex
. Есть ли способ заставить sinon.useFakeTimers
работать в этом сценарии? Может быть, добавив аргумент типа global
к useFakeTimers
который он мог бы использовать для внутреннего вызова withGlobal
?
Есть ли какие-либо новые обновления о том, как заставить sinon.useFakeTimers
работать в этом сценарии. Я все еще получаю это исключение при использовании мокко в jsDom
Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)
@LouisBrunner Мне нравится эта идея, я думаю, что это решение подойдет большинству людей 👍
@mroderick Я создал PR (# 1935), который реализует способ передачи глобального контекста через sinon.useFakeTimers
, я не знаю, был ли это тот API, который вы имели в виду, поэтому не стесняйтесь давать любые отзывы !
Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.
Это было исправлено в # 1935.
Я использую sinon 7.2.7, и когда я пытаюсь использовать sinon.useFakeTimers()
я получаю:
TypeError: Cannot set property performance of #<Window> which has only a getter
Тоже самое.
Может быть Вавилон 7? https://github.com/babel/babel/issues/8363
@ cichy380 и @axelhunn , опубликуйте отчет о проблеме. Эта проблема исправлена.
Самый полезный комментарий
@mroderick Я создал PR (# 1935), который реализует способ передачи глобального контекста через
sinon.useFakeTimers
, я не знаю, был ли это тот API, который вы имели в виду, поэтому не стесняйтесь давать любые отзывы !