2012-09-12 13 views
27

Tôi đang sử dụng phát minh, rolify và cancan. Tôi cũng đang sử dụng rspec với FactoryGirl để thử nghiệm. Ngay bây giờ tôi đang làm việc trên một số thử nghiệm và tôi muốn xác định người dùng với vai trò khác nhau cho những thử nghiệm đó. Dưới đây là dự đoán hiện tại của tôi cho làm thế nào để làm điều đó bằng FactoryGirl:Thiết lập vai trò thông qua rolify trong FactoryGirl định nghĩa

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 

Dưới đây là một số bài kiểm tra của tôi mà dường như không được viết một cách chính xác: require '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 

Khi tôi chạy số kỹ thuật tôi đây là lỗi của tôi:

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

Trả lời

55

tôi thà sử dụng FactoryGirls after(:create)callback để tạo ra vai trò (xem thêm this vấn đề cho Rolify).

Hơn nữa phương pháp has_role? được sử dụng để kiểm tra nếu người dùng có một vai trò đặc biệt, để thiết một vai trò cụ thể mà bạn nên sử dụng phương pháp 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

Cảm ơn, tôi sẽ thử lần sau. Tôi đã chuyển sang phương pháp khác để xử lý vai trò người dùng. –

+0

hoạt động như một sự quyến rũ! – SporkInventor

+0

Câu trả lời hay! Nó hoạt động như bạn mong đợi. – Kulgar