Snapshot тестирование — это метод контроля изменений интерфейсов или компонентов приложения путем сохранения их «снимков» (snapshots) в момент тестирования и последующего сравнения с эталонными версиями. В контексте MDX и JavaScript это особенно полезно для тестирования визуального представления документации и компонентов React, описанных через MDX.
Для работы с Snapshot тестами в экосистеме MDX чаще всего используется комбинация Jest и @testing-library/react. Основные шаги:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom babel-jest
jest.config.js необходимо указать поддержку JSX и MDX:module.exports = {
testEnvironment: 'jsdom',
transform: {
'^.+\\.jsx?$': 'babel-jest',
'^.+\\.mdx$': '@mdx-js/jest'
},
moduleFileExtensions: ['js', 'jsx', 'mdx'],
};
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
Snapshot тесты для MDX отличаются от обычных React-компонентов лишь тем, что входной файл — это MDX-документ, который необходимо рендерить и сравнивать с сохраненным снимком.
Пример теста:
import { render } from '@testing-library/react';
import MyComponent from './MyComponent.mdx';
test('MDX компонент рендерится корректно', () => {
const { container } = render(<MyComponent />);
expect(container).toMatchSnapshot();
});
render из @testing-library/react создаёт
виртуальный DOM компонентa.container содержит HTML, который можно сохранять и
проверять.toMatchSnapshot() автоматически создаёт файл с
эталонным состоянием компонента.__snapshots__..snap.При изменении интерфейса компонента тест может «упасть». Для обновления эталонного снимка используется:
jest -u
Важно понимать, что обновление snapshots не заменяет проверку изменений — оно фиксирует текущую версию.
MDX часто содержит интерактивные элементы, такие как кнопки или формы. Для таких компонентов snapshot тестирование следует сочетать с user-event:
import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import InteractiveComponent from './InteractiveComponent.mdx';
test('Интерактивный MDX компонент', async () => {
const { container, getByText } = render(<InteractiveComponent />);
const button = getByText('Нажми меня');
await userEvent.click(button);
expect(container).toMatchSnapshot();
});
Таким образом фиксируется не только статическая разметка, но и динамическое состояние компонента.
Snapshot тестирование в MDX позволяет поддерживать документацию и визуальные компоненты в актуальном и проверяемом состоянии, сокращая количество визуальных багов и упрощая рефакторинг интерфейсов.