Spec-Zone.ru › Sinon.JS 9

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

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

Spec-Zone.ru

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