Pruebas TDD para crear y actualizar posts
Clase 13 de 33 • Curso de Creación de APIs con Ruby on Rails
Contenido del curso
Proyecto
- 3

Creación de APIs con Rails: Proyecto Blog API paso a paso
04:37 min - 4

Configuración de Gemas para Pruebas en Proyectos Rails
06:26 min - 5

Configuración de Gemas en Proyectos Rails: Arspec, Factory Bot y Database Cleaner
07:25 min - 6

Implementación de un Health Check Endpoint en API con RSpec
12:28 min - 7

Diseño de Casos de Uso y Diagramas de Entidad para Aplicaciones
03:16 min - 8

Diagrama entidad relación: usuario y post
01:41 min - 9

Modelado de Aplicaciones con TDD en Rails
05:59 min - 10

Validaciones y Pruebas TDD en Rails: Modelos USR y Post
07:07 min - 11

Implementación de Endpoints para Listar y Mostrar Posts con TDD
15:12 min - 12

Implementar controlador Posts con TDD
10:34 min - 13

Pruebas TDD para crear y actualizar posts
Viendo ahora - 14

Implementación de Métodos y Manejo de Excepciones en Rails API
10:23 min - 15

Active Model serializers: control total de JSON en Rails
06:03 min - 16

Búsqueda y Filtrado de Posts por Título con TDD
05:57 min - 17

Implementación de Búsqueda de Posts con Servicios en Rails
06:06 min - 18

Problema N+1 en Rails: Detección y Solución Eficaz
04:40 min - 19

Identificación y solución del problema N+1 en Rails
06:20 min - 20

Flujo de Autenticación en APIs con Tokens y Proveedores
05:29 min - 21

Tests con RSpec para autenticación de tokens
12:17 min - 22

Autenticación con Tokens: Implementación en Rails API
05:53 min - 23

Autenticación de Usuarios en Controladores Rails
09:19 min - 24

Autenticación y Seguridad en CRUD de Posts en Rails
09:17 min - 25

Pruebas de Creación y Actualización con Autenticación en Rails
14:21 min - 26

Probando API Ruby on Rails con Postman
10:43 min - 27

Caching en Aplicaciones Web: Funciones y Niveles
07:15 min - 28

Aceleración de Búsquedas en Rails con Caching
08:23 min - 29

Background Jobs en Rails: Conceptos y Funcionalidades
05:45 min - 30

Procesamiento en Background y Envío de Correos con Rails
09:45 min - 31

Envío de Correos en Rails con ActionMailer y Background Jobs
11:06 min - 32
Autenticación y Autorización con JWT y Auth0 en Aplicaciones Web
03:48 min
Cierre
Aprende a cubrir la creación y actualización de posts con enfoque TDD, asegurando rutas, validaciones y estados HTTP correctos. Desde los datos mínimos del payload hasta las respuestas esperadas, aquí se explica paso a paso cómo estructurar las pruebas de post y put para garantizar calidad y claridad desde el inicio.
¿Qué se construye con TDD en la creación y actualización de posts?
Empezamos por las pruebas: una para el método post (crear) y otra para put (actualizar). Se prepara un payload con título, contenido, estado de publicación y user ID. Se aclara que “post” se refiere al método HTTP, no al modelo. Tras enviar la petición al endpoint "posts", se parsea la respuesta con json.parse sobre response.body y se validan estructura, ID y estado HTTP esperado.
Además, se explica que en describe el string es solo descriptivo del contexto del test. Para evitar confusiones entre el método post y la entidad, se usa un nombre alterno como article al preparar datos para la actualización. El flujo TDD se refuerza al ejecutar las pruebas y confirmar que inicialmente fallan por rutas inexistentes, lo cual es el resultado esperado antes de implementar la lógica.
¿Qué datos requiere el payload de creación?
- Título del post.
- Contenido del post.
- Publicado: valor booleano.
- User ID: asociado al usuario creado con let y FactoryBot.
¿Cómo se valida la respuesta del método post?
- Parseo del cuerpo: json.parse sobre response.body.
- Estructura: el payload no debe estar vacío.
- Identidad: el payload debe contener un ID.
- Estado HTTP: se espera created en lugar del número, para mayor legibilidad.
- TDD: al correr pruebas, es correcto que fallen por no encontrar la ruta de "posts".
# Creación
it 'It should create a post' do
# payload con título, contenido, publicado: false, user_id.
post 'posts', params: payload
parsed = json.parse(response.body)
expect(parsed).not_to be_empty
expect(parsed).to include('id')
expect(response).to have_http_status(:created)
end
¿Cómo se prueba la actualización con put sin confusiones?
Para actualizar se necesita un post existente. Se crea con FactoryBot y, para no confundir con el método post, se nombra la variable como article. El payload de actualización puede cambiar título, contenido y publicado (por ejemplo, a true). El user ID no se actualiza. Se envía put con el ID del recurso, se parsea la respuesta y se aseguran las condiciones clave: contenido no vacío, ID igual al existente y estado HTTP ok.
Al ejecutar, las pruebas deben fallar si la ruta put no existe aún. Esto confirma el ciclo TDD: primero rojo, luego la implementación.
¿Qué estados HTTP se comprueban y por qué?
- Creación con post: estado created para indicar que el recurso se creó.
- Actualización con put: estado ok para indicar éxito en la modificación.
- Legibilidad: se pueden usar identificadores en lugar de números.
# Actualización
it 'actualiza el artículo existente' do
# article existente
put "posts/:id", params: payload_actualizado
parsed = json.parse(response.body)
expect(parsed).not_to be_empty
expect(parsed['id']).to eq(article.id)
expect(response).to have_http_status(:ok)
end
¿Cómo se manejan errores y validaciones en creación y actualización?
Se añaden pruebas negativas para confirmar respuestas y mensajes de error. En creación, un título vacío debe devolver estado HTTP unprocessable entity, sin ID y con una llave de error no vacía. En actualización, un payload con título y contenido en nil también debe devolver unprocessable entity y un mensaje de error. Al correr el conjunto, es normal ver las cuatro pruebas fallar si aún no existen las rutas.
¿Qué habilidades y conceptos prácticos se aplican aquí?
- Enfoque TDD: primero pruebas, luego implementación.
- Métodos HTTP post y put para crear y actualizar.
- Estructura de payload con campos mínimos.
- Parseo de JSON con json.parse y uso de response.body.
- Estados HTTP: created, ok, unprocessable entity.
- Manejo de rutas y verificación de fallos iniciales.
- Generación de datos con FactoryBot y aleatorios con Faker.
- Asserts claros con expect y descripciones con describe y string.
- Claridad semántica: diferenciar el método post del modelo post usando article como nombre alterno.
¿Te gustaría compartir cómo validas tus mensajes de error o qué estrategia sigues para nombrar variables y mantener claridad entre métodos HTTP y modelos?