2012-09-12 14 views
27

Ben donanım, roket ve cancan kullanıyorum. Ayrıca test için FactoryGirl ile rspec kullanıyorum. Şu anda bazı testler üzerinde çalışıyorum ve bu testler için farklı rolleri olan kullanıcıları tanımlamak istiyorum. İşteFactoryGirl tanımında rolify yoluyla rollerin ayarlanması

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 

görünmüyor hangi benim testlerin bazıları doğru yazılacak olan: '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 

I gerektiren İşte FactoryGirl kullanarak bunu nasıl benim şimdiki tahminim Bunları benim hatalardır gözlük çalıştırın:

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)>' 

cevap

55

doğrusu roller oluşturmak FactoryGirls after(:create)callback kullanırsınız (ayrıca bkzRolify içinsorunu. Bir kullanıcı özel bir rolü vardır, eğer Eğer add_role yöntemi kullanmak gerekir özel bir rolü belirlemek için

Ayrıca yöntem has_role?, kontrol için kullanılır.

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

Teşekkürler, bunu bir dahaki sefere deneyeceğim. O zamandan beri kullanıcı rollerini ele almak için başka bir yönteme geçtim. –

+0

bir çekicilik gibi çalışır! – SporkInventor

+0

Harika cevap! Beklediğiniz gibi çalışır. – Kulgar