Foto de Karen Lau en Unsplash

Escribir pruebas para el código de la aplicación es algo que todos los programadores deberían estar familiarizados con hacer, independientemente del lenguaje o el marco de trabajo elegido. RSpec es un increíble conjunto de pruebas y DSL (Domain-Specific Language) construido en Ruby, que permite escribir pruebas unitarias con facilidad utilizando un conjunto de métodos predefinidos. Mi introducción a la escritura de código en Ruby estuvo estrechamente ligada a la experiencia de ejecutar religiosamente RSpec para probar lo que había escrito; por eso, cuando empecé a aprender Rails, seguir utilizando RSpec supuso una transición más natural y fluida. Por defecto, Rails utiliza el marco de pruebas MiniTest. Vamos a ver cómo configurar un nuevo proyecto Rails para usar RSpec, y luego exploraremos el uso de Capybara para probar nuestras vistas.

Primero, crearemos un nuevo proyecto Rails ejecutando rails new NAME -T -B, donde NOMBRE es la ruta del directorio para el proyecto que debe crearse. La bandera -T especifica que Rails no debe configurar ningún marco de pruebas para nuestro nuevo proyecto, que es exactamente lo que queremos. La bandera -B indica a Rails que no ejecute bundle install en este punto. A continuación, tenemos que editar nuestro Gemfile para incluir lo siguiente:

group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end

Esto añade tanto RSpec como Capybara a nuestros entornos de desarrollo y prueba. En este punto, ejecuta bundle para instalar las gemas y cualquier dependencia que el proyecto necesite. Me gusta caer en rails console en este punto sólo para comprobar que todo está funcionando, y si no – Vuelvo a mi Gemfile y arreglar cualquier problema.

Ahora que tenemos nuestro esqueleto de proyecto en su lugar, el siguiente paso es para amañar nuestra suite de pruebas. Simplemente ejecute rails generate rspec:install en este punto para crear el directorio spec y la estructura de archivos necesaria. El último paso es decirle a nuestras pruebas que usen Capybara. En spec/rails_helper.rb, añade lo siguiente:

require 'capybara/rspec'

¡Eso es todo para la configuración! Antes de continuar, vamos a confirmar los cambios que hemos hecho en nuestro proyecto: git add . && git commit -m "initial commit". Vamos a crear un controlador y hacer algunas pruebas!

Foto de Max Nelson en Unsplash

Para nuestras pruebas, crearemos un simple formulario con algunas entradas, y luego le diremos a Capybara que rellene algunos datos de muestra y envíe el formulario. No nos preocuparemos de crear ningún modelo complejo ni de persistir la información en una base de datos. Vamos a decirle a Rails que cree un controlador users y que configure algunas rutas para nosotros:

rails generate controller Users new --no-helper --no-assets --no-view-specs

Al especificar --no-helper --no-assets le estamos diciendo a Rails que no cree ningún activo o un ayudante para nuestro controlador. La opción --no-view-specs indica al generador que no cree ningún test para las vistas – más adelante veremos cómo crear los tests que queremos. Rails nos ha creado una ruta new, que podemos ver en config/routes.rb:

Rails.application.routes.draw do
get 'users/new'
end

Y en app/controllers/users_controller.rb:

class UsersController < ApplicationController
def new
end
end

Por último, Rails nos ha creado una vista en app/views/users/new.html.erb. Vamos a editar esta vista para crear un sencillo formulario:

<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>

Necesitamos hacer un par de cosas para terminar de cablear esto. En routes.rb añadimos lo siguiente:

post 'users' => 'users#welcome'

También tenemos que añadir una acción welcome a users_controller.rb:

def welcome
@user = params
render :welcome
end

El último paso aquí es crear views/users/welcome.html.erb e incluir algo de HTML y ERB para mostrar el nombre del usuario:

<h1><%= "Welcome, #{@user}!" %></h1>

¡Felicidades! Si ejecutamos rails server y vamos a localhost:3000/users/new en nuestro navegador, deberíamos ser recibidos con un formulario que nos pide que introduzcamos nuestro nombre. Cuando introducimos nuestro nombre y pulsamos el botón de enviar, deberíamos ser redirigidos a una página que nos da una cálida bienvenida. Todo esto está muy bien, pero tener que probar nuestro código de esta manera para asegurarnos de que funciona cada vez que añadimos un nuevo formulario o implementamos una nueva característica pronto se convertirá en algo agotador. Por suerte, se ha creado una herramienta para probar y automatizar este proceso por nosotros

Aquí es donde entra Capybara. Capybara es un framework que nos permite probar el código de nuestras vistas rellenando los datos del formulario, inspeccionando el contenido de la página y enviando peticiones HTTP al navegador. Vamos a configurar una especificación para probar nuestro formulario recién creado:

rails generate rspec:feature form

Esto generará el archivo spec/features/form_spec.rb. Por defecto, Capybara espera encontrar las especificaciones en un directorio llamado features. Vamos a editar este archivo para añadir una nueva prueba, que rellenará la entrada del campo de texto name y pulsará submit:

require 'rails_helper'RSpec.feature "Forms", type: :feature do
it 'can enter a name and receive a greeting' do
visit 'users/new'
fill_in :name, with: "Capybara"
click_on 'submit'
expect(page).to have_content "Welcome, Capybara!"
end
end

¡Eso es! Hemos creado con éxito nuestro primer test en Rails utilizando RSpec y Capybara. Si ejecutamos rspec --format documentation, deberíamos ver que el test pasa. Siéntete libre de experimentar: ¿qué formas hay de hacer que el test falle? ¿Hay otras pruebas que podamos crear para este ejemplo? Sólo hemos arañado la superficie aquí – esperamos que esto te haga pensar en cómo puedes simplificar y automatizar el proceso de pruebas de tu código utilizando estas herramientas, y adquirir el hábito de probar tu código a menudo.

Visita aquí para el código presentado en este post.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.