Steak acceptance testing +
Por Boris Barroso
Hasta hace algún tiempo he utilizado cucumber como mi herramienta principal de testeo para pruebas de aceptación, pero la verdad suele ser muy vervoso y los clientes no escribiran sus historias.
Steak
Steak es una herramienta minimalista basada en Rspec para realizar pruebas de aceptación, aún no posee algunas de las caracteristicas que extraño de cucumber como las tablas, pero me siento mas confortable con esta herramienta.
Comencemos
El demo que dare sera para rails 3 y mostrare como se puede realizar tests junto a devise, lo primero que hay que hacer es modificar el archivo Gemfile y añadan lo siguiente
gem 'devise' # Es necesario añadir este grupo para que funcionen los generators group :development do gem 'rspec-rails' gem 'steak', '>= 1.0.0.rc.1' end group :test do gem 'rspec' gem 'steak', '>= 1.0.0.rc.1' gem 'capybara' gem 'factory_girl_rails' end
Una ves que tengan esto en su archivo Gemfile ejecuten en la consola
bundle install
y despues que instale las gemas ejecuten
rails generate devise:install rails generate rspec:install rails generate steak:install
Ya tenemos la instalación lista ahora comencemos a realizar tests, como sabran devise es un motor (engine) que nos proporciona autenticación, registro y recuperación de contraseñas, es muy completo pero es necesario añadir el siguiente archivo en spec/acceptance/support/warden.rb para que puedan funcionar los tests
RSpec.configure do |config|
config.include Warden::Test::Helpers
config.after { Warden.test_reset! }
end
Ahora ya podremos testear con devise, si desean saber mas de como funciona devise visiten en este blog (como usar devise con rails 3) donde támbien en los comentarios hay vínculos relacionados con mas detalles sobre devise. Comencemos con algo sencillo, creamos un usuario para poder acceder a una página restringida, tratare de ser lo mas breve asi que usare User en ves de Usuario.
rails generate devise User
Esto genera la migración archivos para testear el modelo, corremos la migración
rake db:migrate
Ahora tenemos que crear la base de datos para hacer tests
rake db:test:clone
Lo que vamos a realizar es permitir solo a los usuarios autenticados ingresar al controlador users
entonces creamos un controlardor para el modelo User
rails generate controller users index show new create destroy update
Ahora tendriamos que editar el archivo config/routes.rb para que nuestro root (raíz) sea el controlador users, entonces aumentamos al archivo dentro de las rutas
root :to => 'users#index'
Entonce ahora si podemos realizar las pruebas y comenzar a testear nuestro sistema. Ahora generemos el test de aceptacion para steak
rails generate steak:spec login_user
Bueno ya tenemos el controlador, el modelo y el test de aceptación pero lo que queremos es que solo usuario User que este logueado pueda tener acceso al controlador users entonces editamos el archivo spec/acceptance/login_user_spec.rb
require File.dirname(__FILE__) + '/acceptance_helper'
feature "Login" do
# Creamos un usuario
background do
User.create(:email => 'user@mail.com', :password => 'demo123', :password_confirmation => 'demo123')
end
# Este es el escenario que correra
scenario "el usuario no debe acceder al controlador users" do
# Primero nos aseguramos de que no haya sesiones de usuarios
visit "/users/sign_out"
visit "/users"
# page es una variable tipo Capybara::Session
page.current_path.should == "/users/sign_in"
end
end
Corramos el test con el comando
rspec spec/acceptance/login_user_spec.rb
Nos retorna un error, hagamos que pase el test, editemos nuestro controlador
class UsersController < ApplicationController
# método de devise que permite verificar si un usuario esta logueado
# caso contrario este redirecciona a '/users/sing_in'
before_filter :authenticate_user!
def index
render :text => 'Prueba'
end
end
Corremos de nuevo nuestro test y vemos que esta ves pasa, ahora veamos como tenemos que hacer el test para que podamos loguearnos y despues visitar users
require File.dirname(__FILE__) + '/acceptance_helper'
feature "Login" do
background do
User.create(:email => 'user@mail.com', :password => 'demo123', :password_confirmation => 'demo123')
end
# El anterior escenario ...
scenario "el usuario debe poder ingresar y loguearse" do
# Primero nos aseguramos de que no haya sesiones de usuarios
visit "/users/sign_out"
visit "/users"
fill_in "user[login]“, :with => ‘user@mail.com’
fill_in “user[password]“, :with => ‘demo123′
click_button “Sign in”
page.current_path.should == “/users”
end
end
Entonces ahora si debe pasar el test :), pero algo que es importante y que nos ayudara a escribir mucho menos código la siguiente ves es poder crear helpers, hagamos que la creación de un usuario y el logueado sea un helper de tal forma que podamos llamar a un método create_and_login_user para crear un usuario y loguearnos, entonces creamos el archivo spec/acceptance/support/helpers.rb
module HelperMethods
def create_and_login_user
Create.user!(:email => 'user@mail.com', :password => 'demo123', :password_confirmation => 'demo123')
visit '/users/sign_out'
visit '/users/sign_in'
fill_in "user[login]“, :with => ‘user@mail.com’
fill_in “user[password]“, :with => ‘demo123′
click_button “Sign in”
end
end
Y ahora solo llamamos al método create_and_login_user dentro de nuestro escenario
hola..ante todo queria felicitarte por ste blog, lo sigo ya desde algun tiempo y siempre saco buena informacion y buenos tutoriales…voy a probar este “bistek” a ver como me va, ya muchas personas me lo han recomendado y por alguna extraña razon tengo problemas con cucumber en rails 3 (algo con los generadores que a fin de cuenta tampoco he tenido tiempo de buscar soluciones)…gracias y espero que sigas posteando mas articulos e info..
Muy útil. Felicitaciones por la nota.
Excelente entrada. (sólo la falta de ortografía: vez ves)
Pero me has salvado la mañana…