Spec-Zone.ru › Sinon.JS 10

Ложные таймеры

Ложные таймеры — это синхронные реализации 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–2020 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v10.0.1/fake-timers

Spec-Zone.ru

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