Mock-тестирование даты в Jest: стабильная работа с moment.js

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы результаты вызовов функции new Date() всегда отображали одну и ту же фиксированную дату, используйте функцию jest.spyOn для создания заглушки глобального объекта Date.

JS
Скопировать код
jest.spyOn(global, 'Date').mockImplementation(() => new Date('2021-01-01T00:00:00Z'));

Таким образом, каждый вызов new Date() будет возвращать дату 1 января 2021 года. Перед тем как завершить тестирование, не забудьте выполнить вызов jest.restoreAllMocks() для удаления всех созданных заглушек.

Кинга Идем в IT: пошаговый план для смены профессии

Почему и когда следует создавать заглушки для дат?

Тестирование компонентов программы, работа которых связана с текущей датой, может столкнуться с проблемами без правильного управления датой и временем. Для того чтобы результаты тестов были стабильными и не зависели от реального времени, создание заглушек для объекта Date в Jest оказывается очень полезным подходом.

Всемирное координированное время – наш выбор!

При тестировании в разных часовых поясах рекомендуется использовать UTC:

JS
Скопировать код
jest.spyOn(global, 'Date').mockImplementation(() => new Date(Date.UTC(2021, 0, 1)));

Помните, часовые пояса не меняют принципов виртуальных "путешествий во времени"! 😉

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Взаимодействие с другими библиотеками для работы с датами

Работа с библиотеками, такими как moment.js, требует гарантированной точности и надёжности дат:

JS
Скопировать код
const moment = require('moment');
jest.spyOn(global, 'Date').mockImplementation(() => new Date('2021-01-01T00:00:00Z'));

const fixedDate = moment(); // moment.js также возвращает 1 января 2021 года!

Очистка после выполнения тестов

Не забывайте сбрасывать заглушки, используя jest.restoreAllMocks(). Эта практика помогает предотвратить влияние на другие тесты.

Визуализация

Вы обрели ключ к вратам времени! (⏱️)

JS
Скопировать код
// Настройка временного механизма
jest.useFakeTimers('modern'); 
jest.setSystemTime(new Date(2020, 3, 1));

Устанавливаем дату, и с вашим виртуальным временем вы выстраиваете контекст.

Markdown
Скопировать код
🔄 Установлено: [1 апреля 2020 года]
🚀 Ваши тесты отправляются в путешествие по симулированной реальности!

Заводите механизм Jest и приготовьтесь к путешествию сквозь время! 🌠

Для любителей точности

Если ваши тесты требуют максимальной точности, функция setSystemTime позволяет установить дату и время до миллисекунды:

JS
Скопировать код
// Полный контроль времени – 15 июня 2022 года, 10:15:30.500
jest.setSystemTime(new Date(Date.UTC(2022, 5, 15, 10, 15, 30, 500)));

Управляйте временем с привычной вам точностью!⚗️

Работа с функциями таймера

Попробуйте работать с функциями таймера, такими как setTimeout и setInterval, добавляя к ним виртуальную дату:

JS
Скопировать код
// В стиле Марти МакФлая: ускоряем течение времени!
jest.runAllTimers();

Более стабильное тестирование с помощью MockDate и Timekeeper

Если вам требуется увеличить стабильность, рассмотрите использование библиотек MockDate и Timekeeper:

JS
Скопировать код
const MockDate = require('mockdate');
MockDate.set('2022-06-15T10:15:30.500Z');

// Тестируем...

MockDate.reset(); // Безопасное возвращение в реальность.

Всё возвращаете в прежнее состояние!🔄

Профессиональные рекомендации и особые случаи

Мокирование конкретных моментов времени

Для мокирования определенных методов объекта Date или для создания заглушки для Date.now(), используйте функцию jest.spyOn():

JS
Скопировать код
jest.spyOn(Date, 'now').mockImplementation(() => 1609459200000); // Кому в наше время нужно реальное время?

Мы путешествуем в прошлое нашего собственного будущего! 🛸

Поддержание порядка: очистка заглушек

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

Надежность тестирования в различных средах

Использование этих методов гарантирует стабильное функционирование ваших тестов, зависящих от даты и времени, в различных CI/CD пайплайнах и средах разработки.

Полезные материалы

  1. Заглушки функций · Jest — Официальная документация Jest по созданию и использованию заглушек.
  2. Заглушки таймеров · Jest — Инструкции по манипуляции с временем в JavaScript-тестах при помощи Jest.
  3. mockdate – npm — Инструмент для установления виртуальной даты, незаменимый при тестировании.
  4. Обсуждения · jestjs/jest · GitHub — Обсуждения о создании заглушек для дат на официальной странице Jest на GitHub.
  5. Medium — Статья о важности заглушек для времени в Jest.
  6. Дата – JavaScript | MDN — Подробное руководство по объекту Date в JavaScript, предоставленное Mozilla.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как можно замокировать дату в Jest так, чтобы каждый вызов new Date() возвращал одну и ту же дату?
1 / 5