Ложные таймеры
Ложные таймеры — это синхронные реализации setTimeout и аналогичных функций, которые Sinon.JS может переопределить, чтобы вам было проще тестировать код с их использованием.
Ложные таймеры предоставляют объект clock, чтобы передавать время, который также может использоваться для управления объектами Date, созданными с помощью new Date(); или Date.now(); (если поддерживается браузером).
Для самостоятельного использования ложных таймеров рекомендуется использовать пакет lolex. Он предоставляет тот же набор функций (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.
С sinon@2.0.0
Вы также можете передать объект Date, и его getTime() будет использоваться в качестве начальной отметки времени.
var clock = sinon.useFakeTimers(config);
Как и выше, но позволяет настроить дополнительные параметры, некоторые из которых:
-
config.now- Число/Дата - устанавливает lolex с указанной эпохой Unix (по умолчанию: 0) -
config.toFake- Массив строк - массив с явными именами функций для имитации. По умолчанию lolex автоматически имитирует все методы, кромеprocess.nextTick. Однако вы можете всё ещё имитироватьnextTick, явно указав его. -
config.shouldAdvanceTime- Булево - сообщает lolex увеличивать имитируемое время автоматически на основе сдвига реального системного времени (по умолчанию: false)
Пожалуйста, посетите lolex.install документацию для полного набора функций.
Важное примечание: при имитации 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);
Пожалуйста, обратитесь к lolex.install документации за полным набором доступных функций и более подробными объяснениями.
С sinon@3.0.0
var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...) больше не поддерживается. Чтобы определить, какие методы имитировать, используйте config.toFake.
clock.tick(time);
Продвигайте часы вперед на time миллисекунд.
Приводит к вызову всех таймеров, запланированных в указанном временном диапазоне. time может быть числом миллисекунд для продвижения часов или удобочитаемой строкой. Допустимые форматы строк — «08» для восьми секунд, «01:00» для одной минуты и «02:34:10» для двух часов, 34 минут и 10 секунд.
Время может быть отрицательным, что приводит к изменению часов, но не вызывает никаких обратных вызовов.
clock.next();
Продвигайте часы до момента первого запланированного таймера, вызвав его.
clock.runAll();
Это выполняет все ожидающие таймеры до тех пор, пока не останется ни одного. Если таймеры добавляются во время выполнения, они также будут выполнены.
Это упрощает выполнение асинхронных тестов до завершения, не беспокоясь о количестве таймеров или задержках в этих таймерах.
clock.restore();
Восстановить имитированные методы.
Вызовите, например, tearDown.
© 2010–2018 Christian Johansen
Licensed under the BSD License.
http://sinonjs.org/releases/v4.5.0/fake-timers