Spec-Zone.ru › Sinon.JS 3

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

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

Важное примечание: при имитации 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);

Обратитесь к lolex.install документации для полного набора доступных функций и более подробных объяснений.

С sinon@3.0.0

var clock = sinon.useFakeTimers([now, ]prop1, prop2, ...) больше не поддерживается. Для определения методов для имитации используйте config.toFake.

clock.tick(time);

Передвинуть таймер вперёд на time миллисекунд.

Вызывает все таймеры, запланированные в указанном временном диапазоне. time может быть числом миллисекунд для продвижения таймера или удобочитаемой строкой. Допустимые форматы строк: “08” для восьми секунд, “01:00” для одной минуты и “02:34:10” для двух часов, 34 минут и 10 секунд.

Значение time может быть отрицательным, это приведет к изменению времени, но не вызовет любые коллбэки.

clock.next();

Передвигает таймер до момента первого запланированного таймера, вызывая его.

clock.runAll();

Это выполняет все ожидающие таймеры, пока не останется ни одного. Если новые таймеры будут добавлены во время его выполнения, они также будут выполнены.

Это упрощает запуск асинхронных тестов до завершения, не беспокоясь о количестве таймеров или задержках в этих таймерах.

clock.restore();

Восстановить имитированные методы.

Вызов например, tearDown.

© 2010–2017 Christian Johansen
Licensed under the BSD License.
http://sinonjs.org/releases/v3.3.0/fake-timers

Spec-Zone.ru

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