Spec-Zone.ru › Sinon.JS 8

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

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

С версии 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–2020 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v8.1.1/fake-timers

Spec-Zone.ru

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