2. Configuración de RSpec

TasteDrivenDishes está funcionando en este momento. Al menos creemos que está funcionando. Nuestra única prueba de ello es que navegamos por los enlaces, creamos algunas cuentas y recetas de prueba, y agregamos y editamos datos a través del navegador web.

¿Lo lanzamos así nomás, verdad?

Por supuesto, este enfoque no escala a medida que agregamos funcionalidades. Antes de continuar, hagamos una pausa en el desarrollo de funcionalidades y agreguemos una suite de pruebas automatizadas, con RSpec en su núcleo. A lo largo del resto de este libro, iremos agregando cobertura a TasteDrivenDishes, comenzando con RSpec y añadiendo otras bibliotecas de prueba según sea necesario para completar la suite.

Hubo un tiempo en que se necesitaba un esfuerzo considerable para lograr que RSpec y Rails funcionaran juntos. Eso ya no es el caso, pero aún necesitaremos instalar algunas cosas y ajustar algunas configuraciones antes de empezar a agregar specs.

En este capítulo, completaremos las siguientes tareas:

  • Comenzaremos usando Bundler para instalar RSpec.
  • A continuación, verificaremos si existe una base de datos de prueba y la instalaremos si es necesario.
  • Por último, ¡configuraremos RSpec para ejecutar la suite de pruebas!

Dependencias

Como RSpec no está incluido en una aplicación Rails predeterminada, necesitaremos tomarnos un momento para instalarlo. Usaremos Bundler para agregar la dependencia. Si aún no tienes una terminal de línea de comandos abierta en la aplicación, abre una ahora. Luego, en el indicador de la línea de comandos, escribe:

bundle add rspec-rails --version "~> 8.0.4" --group "development, test"

Ten en cuenta que solo estamos instalando RSpec para usarlo en los entornos de desarrollo y prueba de la aplicación. No se instalará al desplegar la aplicación en producción. También hemos fijado la versión para que Bundler instale cualquier versión de la gem rspec-rails igual o mayor a 8.0.4, pero no la 8.1 ni versiones más recientes.

Técnicamente, estamos instalando la biblioteca rspec-rails, que incluye rspec-core y algunas otras gems independientes. Si estuvieras usando RSpec para probar una aplicación Ruby que no usa Rails, podrías instalar estas gems de forma individual. rspec-rails las agrupa en una sola instalación conveniente, junto con algunas facilidades específicas de Rails de las que comenzaremos a hablar pronto.

Nuestra aplicación ahora cuenta con el primer bloque fundamental necesario para establecer una suite de pruebas sólida. Lo siguiente: crear nuestra base de datos de prueba.

Base de datos de prueba

Con el propósito de enseñarte sobre RSpec sin demasiada carga adicional, TasteDrivenDishes usa SQLite como backend de base de datos.

Si estás agregando specs a una aplicación Rails existente, es posible que ya tengas una base de datos de prueba en tu computadora. Si no es así, aquí te explicamos cómo agregar una.

Abre el archivo config/database.yml para ver con qué bases de datos está lista para comunicarse tu aplicación. Si no has realizado ningún cambio en el archivo, deberías ver algo como lo siguiente:

config/database.yml
1 test:
2   <<: *default
3   database: storage/test.sqlite3

Para asegurarte de que haya una base de datos con la que comunicarse, ejecuta la siguiente tarea rake:

$ bin/rails db:create:all

Si aún no tenías una base de datos de prueba, ahora ya la tienes. Si ya tenías una, la tarea rails te informa amablemente que la base de datos ya existe — no es necesario preocuparse por eliminar accidentalmente una base de datos anterior. Ahora configuremos el propio RSpec.

Configuración de RSpec

Ahora podemos agregar una carpeta spec a nuestra aplicación y añadir una configuración básica de RSpec. Instalaremos RSpec con la siguiente directiva de línea de comandos:

$ bin/rails generate rspec:install

Y el generador muestra:

      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

Ahora tenemos un archivo de configuración para RSpec (.rspec), un directorio para nuestros archivos de spec a medida que los vayamos creando (spec), y dos archivos auxiliares donde eventualmente personalizaremos cómo RSpec interactuará con nuestro código (spec/spec_helper.rb y spec/rails_helper.rb). Estos dos últimos archivos incluyen muchos comentarios para explicar qué proporciona cada personalización. No necesitas leerlos ahora mismo, pero a medida que RSpec se convierta en una parte habitual de tu kit de herramientas de Rails, te recomiendo encarecidamente que los leas y experimentes con los diferentes ajustes. Esa es la mejor manera de entender qué hacen.

Antes de continuar, echemos un vistazo rápido a algo importante en el archivo rails_helper.rb generado. Cerca del final, verás una línea comentada:

spec/rails_helper.rb
# config.infer_spec_type_from_file_location!

En versiones anteriores de rspec-rails, esta línea estaba descomentada de forma predeterminada, lo que significaba que RSpec detectaba automáticamente el tipo de spec (model, request, system, etc.) según la ubicación del archivo en el directorio spec/. A partir de rspec-rails 8.0, este comportamiento se considera legado. En su lugar, los archivos de spec ahora declaran su tipo de forma explícita, así:

RSpec.describe User, type: :model do
  # ...
end

Los generadores de RSpec ya incluyen la declaración type: en los archivos de spec generados, por lo que todo funciona sin problemas. A lo largo de este libro, verás type: :model, type: :request, type: :system, y otros. Este enfoque explícito deja claro de un vistazo qué tipo de spec estás mirando — sin necesidad de comprobar en qué directorio se encuentra el archivo.

A continuación — y esto es opcional — me gusta cambiar la salida de RSpec del formato predeterminado al formato de documentación, que es más fácil de leer. Esto hace que sea más sencillo ver qué specs están pasando y cuáles están fallando mientras se ejecuta tu suite. También proporciona un esquema atractivo de tus specs para — lo adivinaste — fines de documentación. Abre el archivo .rspec que se acaba de crear y edítalo para que quede así:

.rspec
--require spec_helper
--format documentation

Como alternativa, también puedes añadir el flag --warnings a este archivo. Cuando las advertencias están habilitadas, la salida de RSpec incluirá todas y cada una de las advertencias lanzadas por tu aplicación y las gemas que utiliza. Esto puede ser útil al desarrollar una aplicación real — presta siempre atención a las advertencias de deprecación que arrojan tus pruebas —, pero con el propósito de aprender a hacer pruebas, te recomiendo desactivarla para reducir el ruido en la salida de tus pruebas. Siempre puedes volver a añadirla más adelante.

El binstub de rspec

A continuación, instalemos un binstub para el ejecutor de pruebas de RSpec, simplemente para ahorrarnos un poco de escritura. ¡Estaremos ejecutando la suite de pruebas muy a menudo! En tu línea de comandos, genera el binstub:

bundle binstubs rspec-core

Esto creará un ejecutable rspec dentro del directorio bin de la aplicación. Si por alguna razón no quieres instalar el binstub, puedes saltarte esta sección — solo recuerda usar el comando bundle exec rspec en todos los lugares donde yo use bin/rspec a lo largo del libro.

¡Pruébalo!

Todavía no tenemos ninguna prueba, pero podemos comprobar si RSpec está correctamente instalado en la aplicación. Ejecútalo usando el binstub que acabamos de crear:

$ bin/rspec

Si todo está instalado correctamente, deberías ver una salida parecida a esta:

    No examples found.

    Finished in 0.00019 seconds (files took 0.07574 seconds to load)
    0 examples, 0 failures

Si tu salida es diferente, vuelve atrás y asegúrate de haber seguido los pasos descritos anteriormente.

Resumen

En este capítulo, añadimos RSpec como dependencia a los entornos de desarrollo y pruebas de la aplicación, y configuramos una base de datos exclusiva para pruebas con la que nuestras pruebas puedan interactuar. También añadimos archivos de configuración predeterminados para RSpec.

¡Ahora estamos listos para escribir algunas pruebas! En el próximo capítulo, comenzaremos a probar la funcionalidad de la aplicación, empezando por su capa de modelo.

Ejercicios

  • Si tienes una aplicación Rails existente que necesita cobertura de pruebas, siéntete libre de comenzar a construir una suite de pruebas ahora, siguiendo los pasos que seguimos para instalar y configurar RSpec en TasteDrivenDishes.
  • O, ¡intenta crear una nueva aplicación Rails desde cero! No necesita ser sofisticada ni siquiera única. Una simple lista de tareas o un blog siempre es una excelente opción para aprender, o quizás una herramienta para ayudar a llevar un registro de los elementos de tu colección favorita. ¡Sé tan creativo como quieras!
  • O, ¡quizás tienes ideas para características que añadirías a TasteDrivenDishes! Si ese es el caso, tómate un poco de tiempo para desarrollarlas. No necesitan ser sofisticadas ni bonitas, pero puede que quieras hacer este trabajo en una copia separada del código para evitar conflictos en capítulos futuros.

Cualquiera que sea el camino que elijas, no te preocupes por las pruebas todavía. Si optaste por la ruta de la aplicación Rails existente o la de una aplicación desde cero, instala y configura RSpec en ella ahora. Asegúrate de haber instalado los gems necesarios y haberlos configurado para la aplicación. Verifica que bin/rspec se ejecute con éxito.