Spec-Zone.ru › Sinon.JS 7

Заглушки таймеров

Заглушки таймеров — это синхронные реализации 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 documentation.

Важно: при заглушении 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 documentation.

С 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 секунд.

Значение `time` может быть отрицательным, что приведет к изменению таймера, но не вызовет никаких обратных вызовов.

clock.next();

Переводит таймер до момента первого запланированного таймера и запускает его.

clock.runAll();

Выполняет все ожидающие таймеры до тех пор, пока они не закончатся. Если новые таймеры будут добавлены во время выполнения, они также будут выполнены.

Это упрощает выполнение асинхронных тестов до завершения без необходимости следить за количеством таймеров или задержками в них.

clock.restore();

Восстанавливает первоначальные методы.

Вызов, например, tearDown.

© 2010–2018 Christian Johansen
Licensed under the BSD License.
http://sinonjs.org/releases/v5.1.0/fake-timers

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API