Почему JSDOM входит в бесконечный цикл при использовании с ложными таймерами Sinon? - PullRequest
0 голосов
/ 03 мая 2018

С последней версией JSDOM (11.6.0) я получаю бесконечный цикл при использовании с ложными таймерами Синона.

const sinon = require('sinon');

sinon.useFakeTimers();
require('jsdom'); // This line creates an infinite loop

Как мне избежать этого бесконечного цикла?

1 Ответ

0 голосов
/ 03 мая 2018

Это вызвано новым API производительности.

Реализация использует Date.now () для калибровки часов. Это функция:

// This function assumes the clock is accurate.
function calculateClockOffset() {
  const start = Date.now();
  let cur = start;
  while (cur === start) {
    cur = Date.now();
  }
  ...
}

( source , обратите внимание, что этот код не в JSDOM, а в одной из его зависимостей, w3c-hr-time)

Когда вы запускаете sinon.useFakeTimers();, он будет высмеивать Date.now(), чтобы всегда возвращать одно и то же значение, поэтому приведенный выше код создает бесконечный цикл.

Обходной путь - не издеваться Date, только функции setTimeout / setInterval:

// Sinon 2.x
sinon.useFakeTimers('setTimeout', 'clearTimeout', 'setInterval', 'clearInterval');

// Sinon 3.x or higher
sinon.useFakeTimers({toFake:['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval']});
...