Поддельные таймеры
Поддельные таймеры — это синхронные реализации 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/v11/fake-timers