Это вызвано новым 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']});