Снимки свойств объектов (или snapshot testing) — это один из популярных методов тестирования, который позволяет сохранять состояние объектов и компонентов на определённый момент времени, а затем проверять, не были ли они изменены. В Jest этот подход используется для тестирования вывода функций, компонентов и структуры данных, чтобы убедиться в их стабильности и консистентности в ходе дальнейших изменений кода.
В Jest снимки представляют собой сохранённые версии объектов или HTML-разметки, которые могут быть использованы для сравнения с будущими результатами. Эти снимки сохраняются в специальных файлах и могут быть использованы для проверки, были ли изменения в результатах выполнения тестируемого кода. Если результат теста изменился, Jest предложит пользователю обновить снимок, если изменения являются ожидаемыми, или расследовать проблему, если изменения произошли неожиданно.
Для того чтобы создать снимок в Jest, используется функция
toMatchSnapshot(). Этот метод сравнивает текущее состояние
объекта или компонента с ранее сохранённым снимком. Если снимка нет,
Jest автоматически создаст его и сохранит в соответствующем
каталоге.
Пример создания снимка:
test('проверка снимка объекта', () => {
const obj = { name: 'Иван', age: 30 };
expect(obj).toMatchSnapshot();
});
Когда этот тест выполнится, Jest создаст файл снимка и сохранит объект в его стандартной форме. Если позже объект будет изменён, Jest сравнит текущие данные с уже сохранённой версией и уведомит о различиях.
Если после изменения кода структура объекта или компонента
изменилась, и эти изменения являются ожидаемыми, необходимо обновить
снимок. Jest предоставляет для этого флаг -u, который
автоматически обновляет все снимки.
Для обновления снимков вручную можно использовать команду:
jest --updateSnapshot
Если изменения в коде неожиданны и необходимо их проверить, можно сохранить текущий снимок с помощью команды:
jest --no-updateSnapshot
Это предотвратит автоматическое обновление снимков и позволит тщательно проверить, какие изменения произошли.
Для тестирования компонентов React или других библиотек, работающих с UI, также можно использовать снимки. Снимки помогают зафиксировать разметку компонентов, что позволяет отслеживать изменения в визуальной части приложения.
Пример использования снимков с компонентами React:
import React from 'react';
import { render } from '@testing-library/react';
import MyComponent from './MyComponent';
test('снимок компонента', () => {
const { container } = render(<MyComponent />);
expect(container).toMatchSnapshot();
});
В этом примере рендерится компонент, и его HTML-разметка сохраняется в снимке. В случае изменения компонента, например, добавления нового элемента или изменения стиля, Jest уведомит о различиях.
Не всегда результаты тестов могут быть стабильными, например, при использовании случайных данных или данных, зависящих от времени (например, дат и времени). В таких случаях стоит избегать создания снимков, поскольку они могут изменяться при каждом запуске теста.
Для таких случаев можно использовать метод
.toMatchInlineSnapshot(), который сохраняет снимок прямо в
тесте. Это позволяет избежать внешних файлов, но при этом поддерживать
удобство сравнения.
Пример использования:
test('снимок с датой', () => {
const date = new Date();
expect(date.toISOString()).toMatchInlineSnapshot();
});
Этот метод полезен, когда требуется зафиксировать данные, которые могут изменяться в процессе работы теста (например, время или случайные значения).
Иногда необходимо настроить Jest таким образом, чтобы снимки сохранялись в определённой структуре каталогов или имели специфичный формат. Для этого в конфигурации Jest можно указать путь к директории с снимками.
Пример настройки Jest для использования кастомных директорий для снимков:
"jest": {
"snapshotResolver": "./customSnapshotResolver.js"
}
В этом случае можно создать файл
customSnapshotResolver.js, который будет отвечать за
размещение снимков в нужной структуре.
Преимущества использования снимков в тестах:
Однако существуют и некоторые ограничения:
Использование снимков свойств объектов в Jest значительно упрощает процесс тестирования, позволяя автоматизировать проверку изменений в коде. Однако важно осознавать ограничения и особенности этого метода, чтобы эффективно управлять тестами и избегать ненужных обновлений снимков. Тщательное использование снимков помогает поддерживать стабильность приложения, минимизируя вероятность появления неожиданных изменений, которые могут повлиять на функциональность.