2012-09-12 12 views
27

Estoy usando ide, rollify y cancan. También estoy usando rspec con FactoryGirl para probar. En este momento estoy trabajando en algunas pruebas y quiero definir usuarios con diferentes roles para esas pruebas. Aquí es mi suposición actual de cómo hacer que el uso de factorygirl:Configuración de roles mediante rolify en la definición de FactoryGirl

FactoryGirl.define do 
    factory :user do 
    name 'Test User' 
    email '[email protected]' 
    password 'please' 
    password_confirmation 'please' 
    # required if the Devise Confirmable module is used 
    confirmed_at Time.now 

    factory :admin do 
     self.has_role :admin 
    end 

    factory :curator do 
     self.has_role :curator 
    end 

    factory :super_admin do 
     self.has_role :super_admin 
    end 
    end 
end 

Aquí están algunos de mis pruebas que no parecen estar escritas correctamente: requieren 'spec_helper'

describe "Pages" do 
    subject { page } 

    before do 
     @newpage = FactoryGirl.create(:page) 
     @newpage.save 
    end 

    context 'not logged in' do 
     it_behaves_like 'not admin' 
    end 

    context 'logged in' do 

     context 'as user' do 
      before do 
       @user = FactoryGirl.create(:user) 
       sign_in @user 
      end 

      it_behaves_like 'not admin' 
     end 

     context 'as curator' do 
      before do 
       @curator = FactoryGirl.create(:curator) 
       sign_in @curator 
      end 

      it_behaves_like 'not admin' 
     end 

     context 'as admin' do 
      before do 
       @admin = FactoryGirl.create(:admin) 
       sign_in @admin 
      end 

      it_behaves_like 'admin' 
     end 

     context 'as super admin' do 
      before do 
       @super_admin = FactoryGirl.create(:super_admin) 
       sign_in @super_admin 
      end 

      it_behaves_like 'admin' 
     end 
    end 
end 

Cuando ejecutar las especificaciones que estos son mis errores:

1) Pages logged in as admin behaves like admin can show page 
Failure/Error: Unable to find matching line from backtrace 
NoMethodError: 
    undefined method `has_role=' for #<User:0x007f883384d178> 
Shared Example Group: "admin" called from ./spec/requests/pages_spec.rb:41 
# ./spec/requests/pages_spec.rb:37:in `block (4 levels) in <top (required)>' 

2) Pages logged in as curator behaves like not admin can show page 
Failure/Error: Unable to find matching line from backtrace 
ArgumentError: 
    Factory not registered: curator 
Shared Example Group: "not admin" called from ./spec/requests/pages_spec.rb:32 
# ./spec/requests/pages_spec.rb:28:in `block (4 levels) in <top (required)>' 

3) Pages logged in as super admin behaves like admin can show page 
Failure/Error: Unable to find matching line from backtrace 
ArgumentError: 
    Factory not registered: super_admin 
Shared Example Group: "admin" called from ./spec/requests/pages_spec.rb:50 
# ./spec/requests/pages_spec.rb:46:in `block (4 levels) in <top (required)>' 

Respuesta

55

prefiero usar FactoryGirls after(:create)callback crear roles (véase también this problema para Rolify).

Además, el método has_role? se utiliza para cheque si un usuario tiene un papel específico, a conjunto un papel específico que debe utilizar el método add_role.

FactoryGirl.define do 
    factory :user do 
    name 'Test User' 
    email '[email protected]' 
    password 'please' 
    password_confirmation 'please' 
    # required if the Devise Confirmable module is used 
    confirmed_at Time.now 

    factory :admin do 
     after(:create) {|user| user.add_role(:admin)} 
    end 

    factory :curator do 
     after(:create) {|user| user.add_role(:curator)} 
    end 

    factory :super_admin do 
     after(:create) {|user| user.add_role(:super_admin)} 
    end 
    end 
end 
+0

Gracias, intentaré esto la próxima vez. Desde entonces, pasé a otro método para manejar roles de usuario. –

+0

funciona como un encanto! – SporkInventor

+0

¡Excelente respuesta! Funciona como esperabas. – Kulgar

Cuestiones relacionadas