Spec-Zone.ru › Sinon.JS 13

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

Фиктивные таймеры представляют собой синхронные реализации 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/v13/fake-timers

Spec-Zone.ru

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