MDX сочетает возможности Markdown и JSX, позволяя включать компоненты React прямо в Markdown-файлы. Для обеспечения качества кода и корректной работы контента необходимо использовать специализированные тестовые утилиты. В экосистеме JavaScript наиболее популярными инструментами являются Jest, Testing Library и Storybook вместе с интеграцией MDX.
Для тестирования MDX-файлов требуется корректная конфигурация сборщика (например, Webpack или Vite) и трансформеров для Jest. Основные шаги:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom @mdx-js/react @babel/preset-react babel-jest
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
Jest не понимает MDX-файлы по умолчанию. Для этого используют
jest-transform-stub или собственный трансформер:
// jest.config.js
module.exports = {
transform: {
"^.+\\.mdx$": "@storybook/addon-docs/jest-transform-mdx",
"^.+\\.[jt]sx?$": "babel-jest"
},
moduleFileExtensions: ["js", "jsx", "ts", "tsx", "mdx"]
};
1. Тестирование рендеринга контента
MDX-файл в результате компиляции превращается в React-компонент. Это позволяет использовать стандартные инструменты Testing Library для проверки:
import { render, screen } from '@testing-library/react';
import MyDocument from './example.mdx';
test('рендерит заголовок и параграф', () => {
render(<MyDocument />);
expect(screen.getByText('Пример заголовка')).toBeInTheDocument();
expect(screen.getByText('Это текстовый параграф.')).toBeInTheDocument();
});
Ключевые моменты:
getByText.getByRole или
querySelector.2. Тестирование кастомных MDX-компонентов
MDX позволяет использовать React-компоненты внутри Markdown. Для
тестирования можно передавать кастомные компоненты через
MDXProvider:
import { MDXProvider } from '@mdx-js/react';
import { render, screen } from '@testing-library/react';
import MyDocument from './example.mdx';
const components = {
h1: ({ children }) => <h1 style={{ color: 'red' }}>{children}</h1>
};
test('применяет кастомный компонент к заголовку', () => {
render(
<MDXProvider components={components}>
<MyDocument />
</MDXProvider>
);
const header = screen.getByText('Пример заголовка');
expect(header).toHaveStyle('color: red');
});
Это позволяет контролировать внешний вид и поведение MDX-компонентов на уровне тестов.
3. Интеграция с Jest snapshots
MDX-компоненты удобно проверять через snapshot-тестирование. Это позволяет фиксировать структуру DOM и быстро обнаруживать изменения:
import { render } from '@testing-library/react';
import MyDocument from './example.mdx';
test('snapshot MDX документа', () => {
const { container } = render(<MyDocument />);
expect(container).toMatchSnapshot();
});
Особенности:
MDX-файлы могут содержать интерактивные компоненты, такие как кнопки и формы. В этом случае тестирование аналогично обычным React-компонентам:
import { render, screen, fireEvent } from '@testing-library/react';
import InteractiveMDX from './interactive.mdx';
test('обрабатывает клик по кнопке', () => {
render(<InteractiveMDX />);
const button = screen.getByText('Нажми меня');
fireEvent.click(button);
expect(screen.getByText('Кнопка нажата')).toBeInTheDocument();
});
Преимущества:
@testing-library/react — для
рендеринга MDX-компонентов и поиска элементов по тексту, ролям и
атрибутам.@testing-library/jest-dom — расширяет
возможности Jest для проверки DOM-элементов.@mdx-js/react — позволяет оборачивать
MDX-компоненты и подменять стандартные теги.MDXProvider для передачи кастомных
компонентов в тестах.Тестовые утилиты позволяют не только проверять корректность MDX-документов, но и гарантировать, что интеграция с React-компонентами сохраняет ожидаемое поведение при изменениях кода. Это особенно важно для проектов с динамическими документациями и образовательными платформами, где MDX часто используется для форматирования сложного контента.