Spec-Zone.ru › Sinon.JS 12

Фиктивные таймеры

Фиктивные таймеры — это синхронные реализации 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/v12/fake-timers

Spec-Zone.ru

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