Jasmine предоставляет возможность контролировать время и таймеры
через встроенный объект clock, что позволяет
тестировать асинхронные операции, зависящие от таймеров, без
фактического ожидания. Работа с clock особенно актуальна
при использовании функций setTimeout,
setInterval и методов, взаимодействующих с временем.
clockПеред началом работы с объектом clock необходимо его установить с
помощью метода jasmine.clock().install(). Этот вызов
перехватывает все встроенные таймеры JavaScript, перенаправляя их
управление на Jasmine:
beforeEach(function() {
jasmine.clock().install();
});
Особенности установки:
install() необходимо вызывать перед каждым
тестом, где планируется использование clock.setTimeout,
setInterval или Date будут управляться
Jasmine, что позволяет управлять их выполнением в тестах без фактической
задержки времени.const baseTime = new Date(2026, 0, 11, 10, 0, 0);
jasmine.clock().mockDate(baseTime);
В этом случае объект Date будет возвращать указанное
время, а не системное.
После установки clock, таймеры не запускаются автоматически. Чтобы заставить их выполниться, используется метод tick:
setTimeout(function() {
console.log("Таймер сработал");
}, 1000);
jasmine.clock().tick(1000);
Метод tick(ms) ускоряет внутреннее время Jasmine на
указанное количество миллисекунд, что позволяет тестировать задержки и
интервалы без фактического ожидания.
Важно: tick() работает только после
установки clock. Любые вызовы таймеров до install() будут
использовать реальные системные таймеры.
clockПосле завершения теста необходимо вернуть оригинальные таймеры и объект Date в нормальное состояние. Для этого используется метод:
afterEach(function() {
jasmine.clock().uninstall();
});
Примечания по удалению:
uninstall() восстанавливает все перехваченные таймеры и
объект Date.uninstall() может привести к
непредсказуемому поведению последующих тестов, так как они будут
использовать уже модифицированные таймеры.beforeEach и
afterEach соответственно.Clock позволяет тестировать асинхронные операции без использования промисов или реальных задержек. Например:
function delayedCallback(callback) {
setTimeout(callback, 2000);
}
describe('Тестирование delayedCallback', function() {
beforeEach(function() {
jasmine.clock().install();
});
afterEach(function() {
jasmine.clock().uninstall();
});
it('должен вызвать callback через 2 секунды', function() {
const callback = jasmine.createSpy('callback');
delayedCallback(callback);
jasmine.clock().tick(1999);
expect(callback).not.toHaveBeenCalled();
jasmine.clock().tick(1);
expect(callback).toHaveBeenCalled();
});
});
В этом примере таймеры полностью контролируются Jasmine, а проверка вызывается без реальной задержки времени.
mockDateМетод mockDate позволяет задать фиксированное текущее
время для всех объектов Date:
const fixedTime = new Date(2026, 0, 11, 12, 0, 0);
jasmine.clock().mockDate(fixedTime);
console.log(new Date().toString()); // Всегда выводит фиксированное время
Это полезно для тестирования функций, которые зависят от времени суток, дат или временных интервалов, например логирования или формирования отчетов.
clock только там, где необходим
контроль времени.uninstall.mockDate.tick с точными значениями времени.Использование jasmine.clock() позволяет создавать
предсказуемые, быстрые и надежные тесты для кода, зависящего от таймеров
и текущей даты, полностью исключая необходимость фактического
ожидания.