This project uses Vitest and React Testing Library for testing.
npm testnpm run test:runnpm run test:uinpm run test:coveragesrc/
├── components/
│ ├── Footer.tsx
│ ├── Footer.test.tsx ← Component test
│ ├── Header.tsx
│ └── Header.test.tsx ← Component test
├── test/
│ ├── setup.ts ← Test configuration
│ └── example.test.ts ← Example tests
- Test files:
*.test.tsor*.test.tsx - Place test files next to the components they test
import { describe, it, expect } from 'vitest';
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('renders correctly', () => {
render(<MyComponent />);
expect(screen.getByText('Hello')).toBeInTheDocument();
});
});import { fireEvent } from '@testing-library/react';
it('handles button click', () => {
render(<MyButton />);
const button = screen.getByRole('button');
fireEvent.click(button);
expect(screen.getByText('Clicked!')).toBeInTheDocument();
});import { BrowserRouter } from 'react-router-dom';
render(
<BrowserRouter>
<MyComponent />
</BrowserRouter>
);import { AuthContext } from '../context/AuthContext';
const mockValue = {
isAuthenticated: true,
customer: { firstName: 'John' }
};
render(
<AuthContext.Provider value={mockValue}>
<MyComponent />
</AuthContext.Provider>
);getByText()- Find element by text contentgetByRole()- Find by ARIA role (button, link, etc.)getByTestId()- Find by data-testid attributegetByLabelText()- Find by label textqueryBy...()- Returns null if not found (for asserting absence)findBy...()- Async version, waits for element
After running npm run test:coverage, open coverage/index.html in your browser to view detailed coverage reports.
vitest.config.ts- Vitest configurationsrc/test/setup.ts- Global test setup (runs before each test)