Testing en Rails

  • por Ignacio Fuenzalida

Introducción

Rails viene con un modulo especializado para realizar testing en la aplicación. En este artículo revisaremos cómo está estructurado, la terminología básica que deberás conocer y cómo escribir tests unitarios, funcionales o de integración.

Módulo de Testing

Cuando se crea un nuevo proyecto de rails, por defecto se crea una carpeta llamada 'Test', donde debieran hospedarse todos los tests.

.
|-- app
|-- bin
|-- config
|-- public

|-- test
|   |-- controllers
(Subdirectorio para escribir los test de los controladores)
|   |-- fixtures (Subdirectorio para escribir los test de XXXXX)
|   |-- helpers (Subdirectorio para escribir los test de los helpers)
|   |-- integration (Subdirectorio para escribir los test de XXXX)
|   |-- mailers (Subdirectorio para escribir los test de XXXXX)
|   |-- models (Subdirectorio para escribir los test de los modelos)
|   |-- test_helper.rb (En este archivo debe ir la configuración por defecto para correr los tests)

Método Test

Un test es simplemente un método que 1) hereda de Minitest::Test y 2) su nombre comienza con "test_".

Un test se puede escribir de la siguiente forma:

test "the truth" do
  assert true
end

Rails traduce este método con el nombre "test_the_truth". 

Para correr pruebas se utiliza 

rake test PATH_TO_TEST_FILE

O en Rails 5:

rails test PATH_TO_TEST_FILE [options]

Donde además se le puede indicar qué test se desea correr en específico (especificando el número de línea), en lugar de correr todo el archivo indicado en la ruta.

Assertions

Son líneas de código que evalúan un objeto o expresión.

La clase Minitest viene con varias assertions para usar. Algunas de las más comunes son:

assert, assert_not, assert_equal, assert_same, assert_nil, assert_throws, assert_raises, assert_respond_to

Rails también tiene algunas custom assertions. Algunas de las más comunes son:

assert_difference, assert_generates, assert_response, assert_redirected_to

Además, Rails nos permite heredar de algunas clases especializadas para testear con assertions en diferentes cirtuntancias: 

ActiveSupport::TestCase, ActionMailer::TestCase, ActionView::TestCase, ActionDispatch::IntegrationTest y ActiveJob::TestCase

Cada una de ellas heredan además de Minitest::Assertions.

Test Environment

  • Rails, por defecto, viene con 3 envs: development, test y production.

  • Utilizando el Test Environment, usamos una base de datos especial para testing.

  • Si se crean nuevas migraciones, hay que correr db:test:prepare

Fixtures

  • Son archivos YAML que se utilizan para llenar la base de datos en ambiente de testing. Estos datos se traducen como objetos ActiveRecords.

  • Cada modelo que se involucra en algún test, debe tener un fixture.

  • Se pueden generar muchos datos utilizando ERB.

Subdirectorios de Test

Controllers

Se pueden generar con

rails generate test_unit:TEST_NAME

Se pueden testear las responses a los diferentes requests types.

También se puede testear ajax, flash notices, cookies.

Fixtures

Se deben guardar los archivos de datos en formato YAML.

Helpers

Sirve para testear helpers.

Integration

Se pueden generar con

rails generate integration_test_

Sirven testear varias partes de la aplicación que interactúan entre sí.

Se recomienda que los test hereden de

ActionDispatch::Integration::Runner, ActionDispatch::Integration::RequestHelpers y ActionDispatch::Integration::Session

Mailers

Sirve para testear que:

  • Los emails se procesan correctamente (Crear y Enviar).

  • Test Unitario: Que el contenido del email sea correcto (origen, desinatario, contenido).

  • Test Funcional: Los emails son enviados al tiempo correspondiente.

Models

Se pueden generar con

rails generate test_unit:model