Ложные таймеры
Ложные таймеры — это синхронные реализации setTimeout и друзей, которые Sinon.JS может переопределить глобальные функции, чтобы вам было проще тестировать код, использующий их.
Ложные таймеры предоставляют clock объект для управления временем, который также можно использовать для управления объектами Date, созданными с помощью new Date(); или Date.now(); (если поддерживается браузером).
Для самостоятельного использования ложных таймеров рекомендуется использовать пакет fake-timers вместо него. Он предоставляет тот же набор функций (Sinon использует его под капотом) и был ранее извлечён из Sinon.JS.
{
setUp: function () {
this.clock = sinon.useFakeTimers();
},
tearDown: function () {
this.clock.restore();
},
"test should animate element over 500ms" : function(){
var el = jQuery("<div></div>");
el.appendTo(document.body);
el.animate({ height: "200px", width: "200px" });
this.clock.tick(510);
assertEquals("200px", el.css("height"));
assertEquals("200px", el.css("width"));
}
}
API ложных таймеров
var clock = sinon.useFakeTimers();
Заставляет Sinon заменить глобальные setTimeout, clearTimeout, setInterval, clearInterval, setImmediate, clearImmediate, process.hrtime, performance.now (если доступно) и Date на собственную реализацию, которая привязана к возвращаемому объекту clock.
Запускает таймер с начального значения эпохи Unix (маркер времени 0).
var clock = sinon.useFakeTimers(now);
Как выше, но вместо запуска таймера с отметкой времени 0, запуск происходит с указанной отметкой времени now. Также можно передать объект Date, и его getTime() будет использован для начальной отметки времени.
var clock = sinon.useFakeTimers(config);
Как выше, но позволяет дополнительные параметры конфигурации.
-
config.now- Число/Дата - устанавливает lolex с указанной эпохой Unix (по умолчанию: 0) -
config.toFake- Массив строк - массив с явными именами функций для имитации. По умолчанию lolex автоматически имитирует все методы, *кроме*process.nextTick. Однако вы всё равно можете имитироватьnextTick, явно указав его. -
config.shouldAdvanceTime- Булево значение - сообщает lolex, что он должен автоматически увеличивать имитируемое время, основываясь на реальном сдвиге системного времени (по умолчанию: false). При использовании совместно сconfig.toFake, это будет работать только в том случае, если'setInterval'включено вconfig.toFake. -
config.global- Объект - используйтеglobalвместо обычного глобального объекта. Это полезно, если вы используете JSDOM вместе с Node.
Параметры в основном включают все поддерживаемые методом install() нашей библиотеки fake-timers, за исключением global. Обратитесь к документации fakeTimers.install документации за полным набором функций и более подробными объяснениями.
С sinon@3.0.0
var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...) больше не поддерживается. Чтобы определить, какие методы нужно имитировать, используйте config.toFake.
Важно: при имитации nextTick, обычные вызовы process.nextTick() не будут выполняться автоматически, как в нормальных фазах цикла событий. Вам нужно будет вызвать либо clock.next(), clock.tick(), clock.runAll() или clock.runToLast() (см. пример ниже). Обратитесь к документации lolex для получения дополнительной информации.
Примеры
Устанавливает ложные таймеры на 1 января 2017 года и имитирует только setTimeout и process.nextTick:
var clock = sinon.useFakeTimers({
now: 1483228800000,
toFake: ["setTimeout", "nextTick"],
});
var called = false;
process.nextTick(function () {
called = true;
});
clock.runAll(); //forces nextTick calls to flush synchronously
assert(called); //true
Установить ту же дату, автоматически продвигая имитируемое время (по умолчанию каждые 20ms), заставляя таймеры запускаться автоматически без необходимости tick() таймера:
var clock = sinon.useFakeTimers({
now: 1483228800000,
shouldAdvanceTime: true,
});
setImmediate(function () {
console.log("tick"); //will print after 20ms
});
setTimeout(function () {
console.log("tock"); //will print after 20ms
}, 15);
setTimeout(function () {
console.log("tack"); //will print after 40ms
}, 35);
Использование ложных таймеров с async / await:
async function asyncFn() {
await wait(100);
console.log('resolved 1', Date.now());
await wait(10);
console.log('resolved 2', Date.now());
}
async function test() {
const clock = sinon.useFakeTimers();
setTimeout(() => console.log('timeout', Date.now()), 200);
asyncFn(); // NOTE: no `await` here - it would hang, as the clock is stopped
await clock.tickAsync(200);
}
// test() prints:
// - resolved 1 100
// - resolved 2 110
// - timeout 200
Обратите внимание, что в приведенном выше примере синхронный clock.tick(200) будет выводить только timeout 200 и resolved 1 200.
clock.tick(time); / await clock.tickAsync(time)
Передвинуть время таймера вперёд на time миллисекунд.
Заставляет вызывать все таймеры, запланированные в указанном временном диапазоне. time может быть количеством миллисекунд для продвижения таймера вперёд или удобочитаемой строкой. Допустимые форматы строк: “08” для восьми секунд, “01:00” для одной минуты и “02:34:10” для двух часов, 34 минут и 10 секунд.
tickAsync() также прервет цикл событий, позволяя любым запланированным обратным вызовам обещаний выполниться *до* запуска таймеров.
clock.next(); / await clock.nextAsync()
Продвигает время таймера до момента первого запланированного таймера, запускает его.
nextAsync() также прервет цикл событий, позволяя любым запланированным обратным вызовам обещаний выполниться *до* запуска таймеров.
clock.runAll(); / await clock.runAllAsync()
Выполняет все ожидающие таймеры до тех пор, пока не останется ни одного. Если во время выполнения добавляются новые таймеры, они также будут запущены.
Это облегчает выполнение асинхронных тестов до завершения без беспокойства о количестве используемых таймеров или задержках в этих таймерах.
runAllAsync() также прервет цикл событий, позволяя любым запланированным обратным вызовам обещаний выполниться *до* запуска таймеров.
clock.restore();
Восстановить имитированные методы.
Вызвать, например, tearDown.
© 2010–2022 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v14/fake-timers