Aprende a crear pruebas unitarias efectivas en Django REST Framework con un enfoque práctico: datos de prueba con ORM, simulación de requests con ApiClient, construcción de URL con reverse y validación de permisos que retornan 403. Verás cómo un viewset de appointments expone errores reales y cómo corregirlos rápidamente.
¿Cómo iniciar pruebas unitarias con Django REST Framework?
Para empezar, se trabaja en el archivo tests.py de la aplicación y se hereda de TestCase. La clase de pruebas define un método setup para preparar datos reutilizables y un cliente para las solicitudes. La idea es validar que el listado de appointments funcione correctamente para un viewset específico.
- Crear la clase de pruebas que hereda de TestCase.
- Definir setup para inicializar datos antes de cada prueba.
- Preparar un paciente y un doctor con el ORM.
- Instanciar self.client usando ApiClient para simular requests JSON.
¿Qué datos crear con el ORM para las pruebas?
Se importan los modelos desde pacientes y doctores y se crean instancias mínimas requeridas con el ORM de Django. Esto permite reutilizar datos en múltiples pruebas sin repetir código.
- Paciente con nombre “Luis Martínez”, fecha “1990-12-05”, correo y dirección de ejemplo.
- Doctor “Óscar Barajas”, ciudad “Medellín”, correo de ejemplo y sin vacaciones.
- Datos en self. para que estén disponibles en cada prueba.
¿Por qué usar ApiClient para simular requests?
Se importa desde rest_framework.test y simplifica las pruebas al asumir que todo se envía como JSON por defecto. Evita definir headers en cada caso y hace el flujo más claro.
- Configuración predeterminada para contenido JSON.
- Menos repetición de headers y configuración.
- Integración directa con asserts y respuestas del framework.
¿Cómo resolver la URL con reverse y listar appointments?
Para consultar el listado, se construye la URL con reverse usando el nombre del endpoint. Si la ruta recibe parámetros, se envían como kwargs para interpolarlos automáticamente en la URL.
- Usar reverse con el nombre de la ruta.
- Pasar parámetros como diccionario: id del doctor.
- Enviar un GET con self.client a esa URL.
¿Cómo instalar django extensions y usar show URLs?
Se instala la extensión y se agrega a las aplicaciones instaladas para obtener el comando que lista rutas. Con esto se identifica el nombre exacto de la URL a usar con reverse.
- Instalar con pip install django extensions.
- Agregar a INSTALLED_APPS con guion bajo.
- Ejecutar el comando show_urls para ver nombres de rutas.
¿Cómo construir la URL con parámetros?
Si la ruta requiere un parámetro (como la PK del doctor), se entrega en kwargs. Así reverse compone la URL final del listado de appointments del doctor.
- Identificar el parámetro requerido por la ruta.
- Enviar kwargs con el nombre del parámetro y el id del doctor.
- Validar que la URL resultante sea la esperada.
¿Cómo validar códigos de estado y permisos en el viewset?
Se simula el GET y se verifican resultados con self.assertEqual sobre el status code. Primero se esperaba 200 OK, pero la respuesta mostró 403 por una política de permisos del viewset.
- Hacer la solicitud con self.client.get(url)..
- Comparar response.status_code con status del framework.
- Usar constantes legibles: status.HTTP_200_OK o status.HTTP_403_FORBIDDEN.
¿Cómo hacer aserciones con assert equal y status?
Se importa status desde rest_framework para mejorar la legibilidad de los códigos. Esto facilita entender si la respuesta es correcta sin memorizar números.
- self.assertEqual(response.status_code, status.HTTP_200_OK)..
- Lectura clara del resultado esperado.
- Mensajes de error más útiles al fallar.
¿Qué ocurrió con el 403 y cómo se corrigió?
El viewset exigía el permiso “doctor” y bloqueaba el acceso anónimo, por lo que el test devolvió 403. Esto evidenció que la combinación is authenticated or read only no funcionaba como se esperaba. La corrección fue requerir autenticación y rol de doctor simultáneamente.
- Política original: solo “doctor”, sin lectura pública.
- Resultado de prueba: 403, acceso prohibido.
- Ajuste: usar autenticación y rol “doctor” juntos.
- Reejecución con manage.py test: las pruebas pasan.
Habilidades y conceptos aplicados:
- Diseño de pruebas unitarias con TestCase y setup reutilizable.
- Creación de datos con ORM para paciente y doctor.
- Simulación de requests con ApiClient y contenido JSON.
- Resolución de rutas con reverse y soporte de show_urls.
- Aserciones con self.assertEqual y status legible.
- Gestión de permisos y detección de 403 en viewsets.
- Ejecución de pruebas con manage.py test.
¿Te gustaría que profundicemos en más casos de pruebas, como creación, actualización o eliminación de appointments? Comparte tus dudas o escenarios que quieras validar.