Для работы с React Testing Library в проектах на TypeScript требуется несколько пакетов. Базовый набор включает:
npm install --save-dev @testing-library/react @testing-library/jest-dom @testing-library/user-event jest ts-jest @types/jest
@testing-library/react — основной пакет для рендеринга
компонентов и взаимодействия с ними.@testing-library/jest-dom — набор расширений для
expect, позволяющий писать более читаемые утверждения
(toBeInTheDocument, toHaveTextContent).@testing-library/user-event — имитация действий
пользователя (клики, ввод текста, фокус и т.д.).jest и ts-jest — тестовый раннер и
трансформер TypeScript-кода.@types/jest — определения типов для Jest.Файл jest.config.js или jest.config.ts
должен включать трансформацию TypeScript и поддержку JSX. Пример
конфигурации:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'jsdom',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
transform: {
'^.+\\.(ts|tsx)$': 'ts-jest',
},
testPathIgnorePatterns: ['/node_modules/', '/dist/'],
};
preset: 'ts-jest' — позволяет Jest обрабатывать файлы
.ts и .tsx.testEnvironment: 'jsdom' — имитация браузерного
окружения для рендеринга React-компонентов.setupFilesAfterEnv — путь к файлу, где настраиваются
глобальные расширения, например, подключение
@testing-library/jest-dom.jest.setup.tsФайл jest.setup.ts обеспечивает интеграцию расширений и
дополнительных утилит:
import '@testing-library/jest-dom/extend-expect';
Это добавляет к глобальному объекту expect методы
вроде:
toBeInTheDocument() — проверка наличия элемента в
DOMtoHaveTextContent() — проверка текстаtoHaveAttribute() — проверка атрибутовЕсли проект использует асинхронные тесты с fetch или
axios, здесь можно подключить моки:
global.fetch = jest.fn();
TypeScript требует правильного файла tsconfig.json для
корректного тестирования:
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"jsx": "react-jsx",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"types": ["jest", "node"]
},
"include": ["src", "tests"]
}
Особенности:
"jsx": "react-jsx" — поддержка нового JSX-трансформера
React 17+."types": ["jest", "node"] — подключение типов для
тестов и Node.js."skipLibCheck": true ускоряет компиляцию, игнорируя
проверку типов сторонних библиотек.Рекомендуется разделять тесты по функциональным блокам. Общая структура:
src/
components/
Button.tsx
__tests__/
Button.test.tsx
utils/
helpers.ts
__tests__/
helpers.test.ts
Каждый тестовый файл обычно импортирует render и
screen из @testing-library/react:
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Button from '../Button';
test('кнопка отображается с текстом', () => {
render(<Button label="Нажми меня" />);
const button = screen.getByRole('button', { name: /Нажми меня/i });
expect(button).toBeInTheDocument();
});
render() — рендерит компонент в виртуальный DOM.screen — глобальный объект для поиска элементов.userEvent — симулирует реальные пользовательские
действия.interface ButtonProps {
label: string;
onClick?: () => void;
}
Promise:test('асинхронная загрузка данных', async () => {
render(<DataLoader />);
const item = await screen.findByText(/Загружено/i);
expect(item).toBeInTheDocument();
});
const onClickM ock = jest.fn<void, []>();
render(<Button label="Click" onCl ick={onClickMock} />);
import.meta.env в Vite-проектах нужно
добавить vite-tsconfig-paths и соответствующие моки.@storybook/testing-react для интеграционных тестов
компонентов.@typescript-eslint и
jest-dom.Настройка React Testing Library с TypeScript обеспечивает строгость типов и безопасность во время тестирования, минимизируя ошибки при работе с JSX-компонентами и асинхронными операциями. Это фундаментальная база для построения масштабируемых и поддерживаемых React-проектов.