MDX объединяет возможности Markdown и JSX, что позволяет встраивать React-компоненты прямо в Markdown-документы. При тестировании рендеринга MDX необходимо учитывать как стандартный Markdown-контент, так и динамические React-компоненты. Основная цель тестирования — убедиться, что структура документа и поведение компонентов соответствуют ожиданиям.
Для корректного рендеринга MDX в тестах используется комбинация
библиотек @testing-library/react и
@mdx-js/react. Основные шаги настройки:
npm install @testing-library/react @mdx-js/react @testing-library/jest-dom
MDXProvider, который обеспечивает возможность
переопределения компонентов по типам Markdown.import { MDXProvider } from '@mdx-js/react';
import { render } from '@testing-library/react';
const components = {
h1: (props) => <h1 style={{ color: 'blue' }} {...props} />,
p: (props) => <p style={{ fontSize: '16px' }} {...props} />,
};
const renderMDX = (MDXContent) =>
render(
<MDXProvider components={components}>
<MDXContent />
</MDXProvider>
);
После настройки провайдера важно протестировать стандартные элементы Markdown:
import MyMDX from './example.mdx';
import '@testing-library/jest-dom';
test('рендерит заголовки и абзацы', () => {
const { getByText } = renderMDX(MyMDX);
expect(getByText('Пример заголовка')).toBeInTheDocument();
expect(getByText('Пример параграфа')).toBeInTheDocument();
});
getByText позволяет находить элементы по тексту.toBeInTheDocument проверяет присутствие элемента в
DOM.MDX позволяет использовать любые React-компоненты, что требует проверки их рендеринга и интерактивного поведения:
const Button = ({ onClick, children }) => (
<button onCl ick={onClick}>{children}</button>
);
const components = { Button };
test('рендерит кнопку и обрабатывает клик', () => {
const handleClick = jest.fn();
const { getByText } = renderMDX(() => <Button onCl ick={handleClick}>Нажми меня</Button>);
const button = getByText('Нажми меня');
expect(button).toBeInTheDocument();
button.click();
expect(handleClick).toHaveBeenCalledTimes(1);
});
Ключевые моменты:
click,
change, submit).Снапшоты позволяют фиксировать визуальное и структурное состояние MDX-документа и обнаруживать непреднамеренные изменения:
import { render } from '@testing-library/react';
import MyMDX from './example.mdx';
test('снапшот документа', () => {
const { container } = renderMDX(MyMDX);
expect(container).toMatchSnapshot();
});
Преимущества:
Для больших MDX-документов целесообразно тестировать отдельные секции или компоненты. Это повышает скорость тестирования и упрощает поддержку:
import { Alert } from './components/Alert';
test('рендерит предупреждение с текстом', () => {
const { getByText } = render(<Alert type="warning">Внимание!</Alert>);
expect(getByText('Внимание!')).toBeInTheDocument();
});
Рекомендуется создавать отдельные MDX-компоненты для повторно используемых блоков и тестировать их изолированно.
MDX-документы могут принимать пропсы, влияющие на отображение. В тестах следует проверять все ключевые варианты:
import MyMDXWithProps from './exampleProps.mdx';
test('рендерит контент с пропсами', () => {
const { getByText } = renderMDX(() => <MyMDXWithProps name="Иван" />);
expect(getByText('Привет, Иван!')).toBeInTheDocument();
});
Для полноценного тестирования MDX:
jest.config.js с обработкой .mdx
файлов через babel-jest и @mdx-js/loader.loading,
error, empty).Тщательное тестирование рендеринга MDX обеспечивает надежность отображения документации, блога или любых других интерфейсов, где Markdown и React-компоненты тесно переплетены.