nmenag

Volver a los posts

Configuración de un ambiente pruebas con Rspec en Ruby On Rails - parte 1

Configurar un ambiente de pruebas con Ruby On Rails usando Rspec, Factory-girl, Capybara y otras librerías - parte 1
Por nmenag • Feb 17, 2016

Escribir pruebas automatizadas se ha vuelto muy importante para el desarrollo de software. Con esta práctica encontramos dos términos muy importantes como TDD(test driven development) y BDD(Behavior driven development). Para mayor información puede consultar las siguientes fuentes:

En este post vamos a configurar un ambiente de pruebas en Ruby on Rails usando Rspec.

¿Por qué con Rspec?

Rspec es un framework, un marco de trabajo que nos permite escribir pruebas guiadas al comportamiento(BDD), en la cual nos permite durante en el proceso escribir especificaciones mucho más legibles que dirijan y validen el desarrollo de una aplicación, para mayor información consultar las siguientes fuentes:

Creación del proyecto:

Creamos una aplicación Rails sin testing framework(minitest), Rails por defecto usa minitest para el ambiente de pruebas.

rails new testing-rails-rspec -T

Instalar Rspec

Para instalar Rspec en un proyecto de Ruby On rails vamos a usar una gema llamada rspec-rails

Especificamos rspec-rails en el archivo Gemfile:

group :development, :test do
  gem 'rspec-rails', '~> 3.4', '>= 3.4.2'
end

Descargar e instalar mediante el comando:

bundle install

Ya cuando tengamos instalado rspec-rails ejecutamos el siguente comando:

rails generate rspec:install

Esto nos genera los siguientes archivos que se utilizaran para la configuración:

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

Lea los comentarios de cada archivo para mayor información.

Instalar Factory_girl y Faker

Factory_girl es una libreria para crear objetos de los datos de nuestra aplicación. Faker es una libreria que nos permite generar datos falsos como nombres, emails, direcciones o números de teléfono.

Para su instalación lo especificamos en el Gemfile:

group :development, :test do
  gem 'rspec-rails', '~> 3.4', '>= 3.4.2'
  gem 'factory_girl_rails', '~> 4.6'
  gem 'faker', '~> 1.6', '>= 1.6.1'
end

Si creamos nuestros modelos por el generador de Rails, el nos crea un archivo por cada modelo en la carpeta spec/factories/

por ejemplo si creamos un modelo llamado User:

rails g model user email:string name:string

Por defecto nos genera esto:

invoke  active_record
create    db/migrate/20160215011855_create_users.rb
create    app/models/user.rb
invoke    rspec
create      spec/models/user_spec.rb
invoke      factory_girl
create        spec/factories/users.rb

Vemos en el resultado que nos crear una migración para dicho modelo y vemos que ejecuto factory_girl y nos creo el siguiente archivo ubicado en spec/factories/users.rb, dentro del archivo nos genera el siguente código:

FactoryGirl.define do
  factory :user do
    email "MyString"
    name "MyString"
  end
end

Para que funcione Factory_girl con Rspec debemos decirle a Rspec que use Factory_girl, para hacer ese cambio modificamos lo siguente:

En el archivo spec/rails_helper.rb:

RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  # more code...
end

Lo que vamos a modificar es comentar la linea config.fixture_path = "#{::Rails.root}/spec/fixtures" y añadimos la linea config.include FactoryGirl::Syntax::Methods para que quede algo asi:

Spec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include FactoryGirl::Syntax::Methods
  # more code...
end

usando Faker junto a Factory_girl

Ahora usamos Faker para poder generar datos falsos, para mirar todos los datos que se pueden generar con Faker lo puede ver en el siguente enlace: https://github.com/stympy/faker#usage

Ahora usamos Faker con factory_girl, modificando el archivo que este nos creó para el modelo User:

FactoryGirl.define do
  factory :user do
    email { Faker::Internet.email }
    name { Faker::Name.name }
  end
end

Escribiendo tests para los modelos

En la hora de crear nuestro modelo User por el generador de Rails dentro de la carpeta spec/ nos creo un archivo llamado spec/models/user_spec.rb con el siguente código:

require 'rails_helper'

RSpec.describe User, type: :model do
  pending "add some examples to (or delete) #{__FILE__}"
end

Ahora vamos a crear las pruebas:

Vamos a escribir una prueba que valide si es un registro valido, vamos a decirle al test que no es un registro valido si el nombre esta vacio o nulo:

require 'rails_helper'

RSpec.describe User, type: :model do
  it 'has invalid factory without name' do
    expect(build(:user, name: nil)).not_to be_valid
  end
  #more code..
end

Y lo ejecutamos por consola:

rspec spec/models/user_spec.rb:17

En mi caso mi prueba inicia en la linea 17.

Resultado:

Run options: include {:locations=>{"./spec/models/user_spec.rb"=>[17]}}
F

Failures:

1) User has invalid factory without name
   Failure/Error: expect(build(:user, name: nil)).not_to be_valid
     expected #<User id: nil, email: "jaida@kohler.name", name: nil, created_at: nil, updated_at: nil> not to be valid

Esta prueba no paso ya que nos falta agregar la validación al modelo:

class User < ActiveRecord::Base
  validates :name, presence: true
end

Ahora si ya agregamos la validación al modelo y volvemos a correr el comando que nos hace ejecutar la prueba, el resultado seria el siguente:

Run options: include {:locations=>{"./spec/models/user_spec.rb"=>[17]}}
.

Finished in 0.93453 seconds (files took 7.72 seconds to load)
1 example, 0 failures

Y listo la prueba ya pasa.

Hasta aqui vimos la funcionalidad conjunta entre Rspec, Factory_girl y Faker.

Si quiere ver todas las pruebas que se hiceron para el modelo User y las validaciones que se agregaron para este modelo lo puede mirar en el siguente enlace en un repositorio en github:

https://github.com/nmenag/testing-rails-rspec/tree/install-factory-girl Este es el proyecto que estamos usando para explicar la configuración de un ambiente de pruebas en Rails.