2011-05-27 7 views
8

Estoy intentando mantener mis especificaciones SECAS creando un grupo de ejemplo compartido que realice las verificaciones estándar para todos los controladores de administración (todos los controladores bajo el espacio de nombre Admin de mi proyecto). Estoy luchando por encontrar la manera de hacerlo, ya que el ejemplo compartido necesita proporcionar información sobre qué acciones y parámetros usar. Idealmente, debería presentar errores significativos si falla una prueba (es decir, incluye los detalles de la acción que estaba probando).Generación dinámica de ejemplos compartidos en RSpec 2?

require 'spec_helper' 

shared_examples "an admin controller" do 

    before(:each) do 
    @non_admin = User.make 
    @admin = User.make(:admin) 
    end 

    context "as an admin user" do 
    @actions.each do |action, params| 

     specify "I should be able to access ##{action.last} via #{action.first}" do 
     self.active_user = @admin 
     send(action.first, action.last, params) 

     response.status.should be_ok 
     end 

    end 
    end 

    context "as a regular user" do 
    @actions.each do |action, params| 

     specify "I should be denied access to ##{action.last}" do 
     self.active_user = @non_admin 
     send(action.first, action.last, params) 

     response.status.should be 403 
     end 

    end 
    end 

end 

describe Admin::UserNotesController do 

    @user = User.make 
    @actions = { [:get, :index] => { :user_id => @user.id }, 
       [:get, :new]  => { :user_id => @user.id }, 
       [:post, :create] => { :user_id => @user.id } } 

    it_behaves_like "an admin controller" 

end 

Este errores por la razón obvia de que @actions no es visible para el grupo de ejemplo compartida. Si uso let, esto solo está disponible en el contexto de un ejemplo, no en el contexto del bloque describe. ¿Algunas ideas?

Respuesta

27

Aquí está una manera mucho más limpia que debería funcionar:

require 'spec_helper' 

shared_examples "an admin controller" do |actions| 
    context "as an admin user" do 
    actions.each_pair do |action, verb| 
     specify "I should be able to access ##{action} via #{verb}" do 
     send(verb, action, :user_id => User.make(:admin).id) 
     response.status.should be_ok 
     end 
    end 
    end 

    context "as a regular user" do 
    actions.each_pair do |action, verb| 
     specify "I should be denied access to ##{action}" do 
     send(verb, action, :user_id => User.make.id) 
     response.status.should be 403 
     end 
    end 
    end 
end 

describe Admin::UserNotesController do 
    it_behaves_like "an admin controller", { 
    :index => :get, 
    :new => :get, 
    :create => :post 
    } 
end 

Ver http://relishapp.com/rspec/rspec-core/v/2-6/dir/example-groups/shared-examples para más información

+1

Este es brillante, gracias! No hay nada como borrar el código :) – d11wtq

Cuestiones relacionadas