2012-09-12 54 views
27

我正在使用devise,rolify和cancan。我也使用RSpec與FactoryGirl進行測試。現在我正在進行一些測試,我想爲這些測試定義具有不同角色的用戶。下面是我對如何在使用FactoryGirl做當前的猜測:在FactoryGirl定義中通過rolify設置角色

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 

下面是我的一些測試,這似乎並不正確寫入: 需要「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 

當我運行規範我這是我的錯誤:

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

回答

55

我寧願用FactoryGirls after(:create)callback創建角色(見Rolify的問題)。

此外,該方法has_role?用於檢查如果用戶有一個特定的角色,設置一個特定的角色,你應該使用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

謝謝,我會在下次嘗試。此後,我轉向另一種處理用戶角色的方法。 –

+0

工程就像一個魅力! – SporkInventor

+0

很好的答案!它按照您的預期工作。 – Kulgar