Sinon: «TypeError: невозможно прочитать свойство 'now' of undefined», когда sinon.useFakeTimers ()

Созданный на 5 июл. 2018  ·  15Комментарии  ·  Источник: sinonjs/sinon

Опишите ошибку
Используя 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 - все в порядке!

Мое репо:
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23

Контекст (просьба заполнить следующую информацию):

  • Версия библиотеки: 6.1.0
  • Окружающая среда: Ubuntu 16.04
  • Пример URL:
  • Другие библиотеки, которые вы используете:

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

    • Мокко 5.2.0

    • Webpack 4.15.1

Help wanted stale

Самый полезный комментарий

@mroderick Я создал PR (# 1935), который реализует способ передачи глобального контекста через sinon.useFakeTimers , я не знаю, был ли это тот API, который вы имели в виду, поэтому не стесняйтесь давать любые отзывы !

Все 15 Комментарий

Та же проблема с [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 , опубликуйте отчет о проблеме. Эта проблема исправлена.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги