Validaciones y Pruebas TDD en Rails: Modelos USR y Post

Clase 10 de 33Curso de Creación de APIs con Ruby on Rails

Resumen

Aplicar TDD en Rails con RSpec fortalece la calidad del código desde el inicio. Aquí se escribe primero la prueba, se observa cómo falla y luego se implementa lo mínimo para ponerla en verde. En este caso, se validan campos clave en los modelos Post y User, y se comprueban relaciones usando association matchers.

¿Qué objetivo tiene TDD en Rails con RSpec?

El propósito es asegurar que el comportamiento cumpla los requerimientos desde el diseño. Primero se crean pruebas en post_spec.rb, luego se ejecutan, fallan y se implementan las validaciones necesarias en los modelos.

  • Escribir pruebas con contexto usando describe e it para mensajes claros al fallar.
  • Usar matchers como “should validate presence of …”.
  • Agrupar verificaciones: “validate presence of required fields”.
  • Ejecutar en terminal y corregir hasta ver todo en verde.

¿Qué pruebas fallan primero y por qué?

  • Falla la validación de title en Post al no existir la lógica de validación.
  • Luego fallan content, published y user_id al no estar validados.
  • En User fallan email, name, auth_token y la relación con Post.

¿Por qué es útil eliminar el pending autogenerado?

  • Evita falsos positivos en archivos de prueba.
  • Indica que ya se están implementando pruebas reales.

¿Cómo se escriben pruebas de validaciones y relaciones?

Se crean pruebas declarativas y legibles. Se aprovechan matchers de validación y de asociación.

¿Cómo validar presencia con RSpec?

  • Usar el patrón “validate presence of …” para campos obligatorios.
  • Mantener nombres claros como “validate presence of required fields”.

Ejemplo de pruebas para Post:

# spec/models/post_spec.rb
RSpec.describe Post, type: :model do
  describe 'validations' do
    it 'validate presence of required fields' do
      should validate_presence_of(:title)
      should validate_presence_of(:content)
      should validate_presence_of(:published)
      should validate_presence_of(:user_id)
    end
  end
end

¿Cómo probar relaciones con association matchers?

  • Verificar que User tenga muchos posts con “should have many posts”.

Ejemplo de pruebas para User:

# spec/models/user_spec.rb
RSpec.describe User, type: :model do
  describe 'validations' do
    it 'validate presence of required fields' do
      should validate_presence_of(:email)
      should validate_presence_of(:name)
      should validate_presence_of(:auth_token)
    end
  end

  describe 'relations' do
    it 'validate relationships' do
      should have_many(:posts)
    end
  end
end

¿Cómo se implementan las validaciones en los modelos?

Tras ver fallar las pruebas, se agregan las validaciones mínimas en los modelos para que pasen. Esto cumple el ciclo de escribir, fallar, implementar, pasar.

¿Qué validaciones requiere Post?

  • title, content, published y user_id con presencia obligatoria.
# app/models/post.rb
class Post < ApplicationRecord
  validates :title, presence: true
  validates :content, presence: true
  validates :published, presence: true
  validates :user_id, presence: true
end

¿Qué validaciones y relaciones requiere User?

  • email, name, auth_token con presencia obligatoria.
  • Relación con muchos posts.
# app/models/user.rb
class User < ApplicationRecord
  has_many :posts

  validates :email, presence: true
  validates :name, presence: true
  validates :auth_token, presence: true
end

¿Te gustaría comentar cómo nombras tus pruebas o qué matchers usas para mantenerlas legibles y efectivas?