UI layer
🖥️ UI Layer - Componentes
Qué testear aquí:
- Renderizado correcto
- Interacciones de usuario
- Integración con hooks
- Estados visuales (loading, error)
Testing de Componentes:
// features/posts/ui/__tests__/PostForm.test.tsx
describe('PostForm', () => {
const mockOnSubmit = jest.fn();
beforeEach(() => {
mockOnSubmit.mockClear();
});
test('submits form with correct data', async () => {
// Arrange
const { user } = render(<PostForm onSubmit={mockOnSubmit} />);
// Act
await user.type(screen.getByLabelText('Contenido'), 'Mi primer post');
await user.click(screen.getByText('Publicar'));
// Assert
expect(mockOnSubmit).toHaveBeenCalledWith({
content: 'Mi primer post',
image: null
});
});
test('shows error when content is empty', async () => {
// Arrange
render(<PostForm onSubmit={mockOnSubmit} />);
// Act
await user.click(screen.getByText('Publish'));
// Assert
expect(screen.getByText('Content is required')).toBeInTheDocument();
expect(mockOnSubmit).not.toHaveBeenCalled();
});
test('shows loading state during submission', async () => {
// Arrange
const slowSubmit = () => new Promise(resolve => setTimeout(resolve, 100));
render(<PostForm onSubmit={slowSubmit} />);
// Act
await user.type(screen.getByLabelText('Content'), 'Post');
await user.click(screen.getByText('Publish'));
// Assert
expect(screen.getByText('Publishing...')).toBeInTheDocument();
});
});
Mejores prácticas UI Testing:
- Testear comportamientos, no implementaciones
- Usar queries accesibles (
getByRole,getByLabelText) - Mockear hooks de aplicación, no APIs directas
- Simular interacciones reales (clicks, typing, submits)