MDX (Markdown + JSX) позволяет использовать компоненты React внутри markdown-файлов, что открывает широкие возможности для создания интерактивной документации и демонстрации компонентов. При работе с MDX часто возникает необходимость тестирования компонентов, особенно в образовательных или демонстрационных целях. Для этого применяются моки и стабы.
Основное различие заключается в степени интерактивности: мок отслеживает вызовы и позволяет проверять взаимодействие, стаб же просто предоставляет фиктивные значения без контроля за вызовами.
В MDX часто требуется демонстрировать компонент с внешними зависимостями, такими как API или глобальные состояния. Пример структуры мока:
// mockApi.js
export const fetchUser = jest.fn(() => Promise.resolve({ id: 1, name: 'Alice' }));
import { fetchUser } from './mockApi';
import { UserCard } from './UserCard';
Здесь компонент UserCard получает мок-функцию
fetchUser вместо реального API. Это позволяет:
Стабы чаще применяются, когда необходимо просто отобразить данные без сложной логики. Пример:
// userStub.js
export const userStub = { id: 2, name: 'Bob', role: 'admin' };
import { userStub } from './userStub';
import { UserCard } from './UserCard';
Преимущества использования стабов:
MDX активно применяется в Storybook, что делает моки и стабы особенно полезными для визуальных историй компонентов.
import { Meta, Story } from '@storybook/addon-docs/blocks';
import { UserCard } from './UserCard';
import { fetchUser } from './mockApi';
import { userStub } from './userStub';
Такой подход позволяет разделять демонстрации с контролем поведения и с фиктивными данными, обеспечивая гибкость и безопасность MDX-документации.
Отдельные файлы для моков и стабов Создание
отдельной папки __mocks__ или stubs упрощает
повторное использование.
Явное именование функций и объектов Например,
fetchUserMock, userStubAdmin, чтобы избежать
путаницы.
Минимальная реализация стабов Не стоит перегружать стабы лишней логикой — их цель только предоставить данные для рендеринга.
Использование jest.fn или sinon для моков Позволяет отслеживать вызовы функций, что полезно для тестов и Storybook.
Комбинация с пропсами компонентов Передача мока или стаба через пропсы обеспечивает гибкость и совместимость с любыми MDX-компонентами.
MDX-документация часто содержит интерактивные примеры компонентов. Тестирование таких компонентов требует моков и стабов:
Пример теста:
import { render, screen } from '@testing-library/react';
import { UserCard } from './UserCard';
import { fetchUser } from './mockApi';
test('отображает имя пользователя из мока', async () => {
render( );
const userName = await screen.findByText('Alice');
expect(userName).toBeInTheDocument();
expect(fetchUser).toHaveBeenCalledTimes(1);
});
Этот подход обеспечивает контролируемое окружение, где можно безопасно демонстрировать и тестировать MDX-компоненты.