MDX (Markdown for JSX) позволяет объединять разметку Markdown и React-компоненты в одном файле. Тестирование таких компонентов требует понимания того, как JSX интегрирован с Markdown, и как правильно изолировать компонент для unit-тестирования.
MDX-файл обычно состоит из трёх частей:
Импорты компонентов
import { Button } from './Button';Markdown-разметка
# Заголовок
Здесь используется компонент:
<Button>Click me</Button>Встраивание React-компонентов Любой JSX-код может быть вставлен напрямую в MDX-файл, что делает тестирование сложнее, чем обычного React-компонента, поскольку Markdown-контент должен быть корректно обработан.
Для MDX-компонентов подходят стандартные инструменты React-тестирования:
Пример установки:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom @mdx-js/react
MDX-файлы не могут быть импортированы напрямую в Jest без обработки. Используется транспайлер или мок-файлы.
Настройка Babel для MDX:
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": ["@babel/plugin-transform-react-jsx"]
}Мок MDX для Jest: В jest.config.js
можно добавить:
moduleNameMapper: {
"\\.mdx$": "<rootDir>/__mocks__/mdxMock.js"
}
Где mdxMock.js экспортирует
React-компонент-заглушку:
import React from 'react';
export default ({ children }) => <div>{children}</div>;MDX требует обёртки через MDXProvider из
@mdx-js/react для корректной интерпретации JSX внутри
Markdown. Пример:
import { render, screen } from '@testing-library/react';
import { MDXProvider } from '@mdx-js/react';
import MyMDXComponent from './MyComponent.mdx';
test('рендерит заголовок и кнопку', () => {
render(
<MDXProvider>
<MyMDXComponent />
</MDXProvider>
);
expect(screen.getByText('Заголовок')).toBeInTheDocument();
expect(screen.getByText('Click me')).toBeInTheDocument();
});
Для кнопок, форм и других интерактивных компонентов используется
fireEvent или userEvent из
@testing-library/user-event:
import userEvent from '@testing-library/user-event';
test('кнопка реагирует на клик', async () => {
render(
<MDXProvider>
<MyMDXComponent />
</MDXProvider>
);
const button = screen.getByText('Click me');
await userEvent.click(button);
expect(screen.getByText('Clicked')).toBeInTheDocument();
});
Unit-тестирование предполагает проверку отдельного компонента без побочных эффектов. Для MDX это важно, поскольку Markdown-контент может содержать сложные вставки:
Для статичных MDX-файлов удобно использовать snapshot-тесты:
import { render } from '@testing-library/react';
import { MDXProvider } from '@mdx-js/react';
import MyMDXComponent from './MyComponent.mdx';
test('snapshot MDX компонента', () => {
const { container } = render(
<MDXProvider>
<MyMDXComponent />
</MDXProvider>
);
expect(container).toMatchSnapshot();
});
Snapshot-тесты фиксируют текущую структуру DOM, что полезно для проверки изменений Markdown-разметки и встроенных компонентов.
MDXProvider — приводит к
ошибкам интерпретации JSX.MDXProvider.Такой подход позволяет покрыть как статические элементы Markdown, так и динамические React-компоненты внутри MDX-файлов, обеспечивая надёжность и стабильность интерфейса.