npm install --save-dev @testing-library/react @testing-library/jest-dom
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
test('renders button and handles click', async () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>Click me</Button>);
const button = screen.getByRole('button', { name: /click me/i });
expect(button).toBeInTheDocument();
await userEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
test('loads and displays data', async () => {
render(<UserList />);
expect(screen.getByText(/loading/i)).toBeInTheDocument();
const users = await screen.findAllByRole('listitem');
expect(users).toHaveLength(3);
});
import { rest } from 'msw';
import { setupServer } from 'msw/node';
const server = setupServer(
rest.get('/api/users', (req, res, ctx) => {
return res(ctx.json([
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' }
]));
})
);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
import { renderHook, act } from '@testing-library/react';
test('useCounter', () => {
const { result } = renderHook(() => useCounter());
expect(result.current.count).toBe(0);
act(() => {
result.current.increment();
});
expect(result.current.count).toBe(1);
});
test('matches snapshot', () => {
const { container } = render(<Card title="Test" />);
expect(container).toMatchSnapshot();
});
import { test, expect } from '@playwright/test';
test('user can login', async ({ page }) => {
await page.goto('http://localhost:3000');
await page.fill('input[name="email"]', 'test@example.com');
await page.fill('input[name="password"]', 'password');
await page.click('button[type="submit"]');
await expect(page.locator('text=Welcome')).toBeVisible();
});