RSpec es una de las herramientas más populares en el ecosistema de Ruby para la prueba de aplicaciones. Es un framework de testing orientado a comportamiento (BDD, Behavior-Driven Development) que permite escribir tests legibles y expresivos, facilitando el proceso de verificación del código. En este artículo, aprenderás cómo realizar tests con RSpec, incluyendo la instalación, la configuración y algunos ejemplos prácticos para que puedas comenzar a probar tus aplicaciones en Ruby de manera efectiva.
RSpec es una gema que proporciona un DSL (Domain-Specific Language) para escribir pruebas en Ruby. A diferencia de otros frameworks de pruebas, RSpec se centra en describir el comportamiento esperado del código en lugar de simplemente verificar que los métodos devuelvan los valores correctos. Gracias a su sintaxis legible y su enfoque en la claridad, RSpec permite que los desarrolladores escriban tests que son fáciles de entender y mantener.
Antes de comenzar a escribir tests, es necesario instalar la gema rspec en tu proyecto de Ruby. Puedes agregarla a tu archivo Gemfile o instalarla manualmente.
Gemfile
Si estás utilizando Bundler para gestionar las dependencias de tu proyecto, puedes agregar rspec a tu archivo Gemfile de la siguiente manera:
# Gemfile
group :test do
gem 'rspec'
end
Luego, ejecuta el siguiente comando para instalar la gema:
bundle install
Si no estás utilizando Bundler, puedes instalar la gema ejecutando:
gem install rspec
Después de instalar RSpec, es recomendable inicializarlo en tu proyecto para que genere la estructura de carpetas y archivos necesarios. Esto se hace con el siguiente comando:
rspec --init
Este comando creará un archivo spec/spec_helper.rb y un archivo de configuración .rspec en la raíz de tu proyecto. El archivo spec_helper.rb contiene las configuraciones básicas para tus pruebas y puedes modificarlo según las necesidades de tu proyecto.
Las pruebas con RSpec se organizan en archivos dentro de la carpeta spec. A continuación, se muestra un ejemplo básico de cómo se estructura un test con RSpec para un módulo de cálculo matemático.
Supongamos que tenemos un archivo math.rb que contiene una clase Calculator. La estructura del proyecto sería la siguiente:
project/
├── lib/
│ └── math.rb
└── spec/
└── math_spec.rb
En el archivo lib/math.rb definimos la funcionalidad que queremos probar:
# lib/math.rb
class Calculator
def add(a, b)
a + b
end
def subtract(a, b)
a - b
end
end
El archivo spec/math_spec.rb contendrá las pruebas para la clase Calculator. Aquí usamos la sintaxis de RSpec para describir el comportamiento de cada método:
# spec/math_spec.rb
require 'rspec'
require_relative '../lib/math'
RSpec.describe Calculator do
describe '#add' do
it 'suma dos números correctamente' do
calculator = Calculator.new
result = calculator.add(2, 3)
expect(result).to eq(5)
end
end
describe '#subtract' do
it 'resta dos números correctamente' do
calculator = Calculator.new
result = calculator.subtract(5, 2)
expect(result).to eq(3)
end
end
end
RSpec.describe: Se utiliza para describir la clase o el módulo que se va a probar. En este caso, estamos describiendo la clase Calculator.
describe '#add': Cada método de la clase se describe con un bloque describe. El # antes del nombre indica que se trata de un método de instancia.
it 'suma dos números correctamente': Define un ejemplo individual (test case). El string que pasamos debe describir el comportamiento esperado.
expect(result).to eq(5): expect se usa para definir las expectativas de la prueba. Aquí esperamos que el resultado de calculator.add(2, 3) sea igual a 5.
Para ejecutar las pruebas de tu proyecto, navega a la carpeta raíz y ejecuta el siguiente comando:
rspec
Este comando ejecutará todos los tests dentro de la carpeta spec y mostrará un resumen de los resultados en la consola.
Si solo quieres ejecutar un archivo o un ejemplo específico, puedes proporcionar la ruta al archivo:
rspec spec/math_spec.rb
O incluso especificar una línea en particular:
rspec spec/math_spec.rb:10
Esto es útil para ejecutar pruebas individuales cuando trabajas en partes específicas de tu código.
RSpec es muy flexible y permite muchas configuraciones avanzadas para adaptarse a las necesidades de tu proyecto. Algunas de las configuraciones más comunes incluyen:
spec_helper.rb
El archivo spec_helper.rb contiene las configuraciones predeterminadas para tus pruebas. Puedes agregar configuraciones globales como:
RSpec.configure do |config|
config.color = true
config.formatter = :documentation
end
config.color = true: Activa el color en la salida de la consola, facilitando la lectura de los resultados.
config.formatter = :documentation: Cambia el formato de salida a uno más detallado.
Si necesitas ejecutar código antes o después de cada prueba, puedes usar los hooks before y after:
RSpec.describe Calculator do
before(:each) do
@calculator = Calculator.new
end
after(:each) do
puts "Test completado"
end
# Pruebas aquí...
end
let y subject en RSpec
Para evitar la repetición de código y hacer las pruebas más legibles, RSpec ofrece la palabra clave let para definir variables y subject para definir el objeto principal de la prueba.
let
RSpec.describe Calculator do
let(:calculator) { Calculator.new }
describe '#add' do
it 'suma dos números' do
expect(calculator.add(1, 2)).to eq(3)
end
end
end
subject
RSpec.describe Calculator do
subject { described_class.new }
describe '#subtract' do
it 'resta correctamente' do
expect(subject.subtract(5, 2)).to eq(3)
end
end
end
Puedes probar que un método lance una excepción usando el matcher raise_error:
RSpec.describe Calculator do
it 'lanza un error al dividir por cero' do
expect { subject.divide(5, 0) }.to raise_error(ZeroDivisionError)
end
end
RSpec es una herramienta poderosa para realizar pruebas en Ruby, proporcionando una sintaxis clara y comprensible. Con los ejemplos anteriores, deberías tener un buen punto de partida para escribir tus propias pruebas y asegurar que tu código se comporta como se espera. A medida que avances, podrás explorar más características avanzadas como shared_examples, mocking y stubbing para cubrir casos de prueba más complejos.
¡Empieza a escribir tus pruebas con RSpec y mejora la calidad de tu código! 😈
Jorge García
Fullstack developer