Best Practices
Качество тестов определяется устойчивостью к изменениям реализации, читаемостью и отражением реального поведения системы.
Что НЕ тестировать
FORBIDDEN
Не тестируйте библиотеки — предполагается, что у них есть собственное покрытие.
// ❌ Тестируем next/navigation
expect(mockPush).toHaveBeenCalledWith('/');
// ✅ Тестируем свою логику
it('redirects to dashboard after successful login', async () => {
render(<LoginPage />);
await userEvent.type(screen.getByLabelText('Email'), '[email protected]');
await userEvent.type(screen.getByLabelText('Password'), 'secret');
await userEvent.click(screen.getByRole('button', { name: 'Login' }));
expect(await screen.findByText('Dashboard')).toBeInTheDocument();
});
Не тестируйте моки — тест должен проверять результат, а не факт вызова.
// ❌ Тестируем мок
const mockFetch = vi.fn();
render(<Component fetch={mockFetch} />);
expect(mockFetch).toHaveBeenCalled();
// ✅ Тестируем результат
server.use(http.get('/api/user', () => HttpResponse.json({ name: 'John' })));
render(<Component />);
expect(await screen.findByText('John')).toBeInTheDocument();
Не используйте импортированные константы в assertions — тест должен читаться как спецификация.
// ❌
import { ERROR_MESSAGE } from './constants';
expect(screen.getByText(ERROR_MESSAGE)).toBeInTheDocument();
// ✅
expect(screen.getByText('Invalid email')).toBeInTheDocument();