通过FactoryGirl定义中的rolify设置角色

我正在使用设计,rolify和cancan。 我也在使用rspec和FactoryGirl进行测试。 现在我正在进行一些测试,我想为这些测试定义具有不同角色的用户。 以下是我目前对使用FactoryGirl进行操作的猜测:

FactoryGirl.define do factory :user do name 'Test User' email 'example@example.com' 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 

以下是我的一些测试似乎没有正确编写:require’pec_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 # Shared Example Group: "admin" called from ./spec/requests/pages_spec.rb:41 # ./spec/requests/pages_spec.rb:37:in `block (4 levels) in ' 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 ' 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 ' 

我宁愿after(:create) 回调 after(:create)使用FactoryGirls来创建角色(也请参阅Rolify的这个问题)。

此外,方法has_role? 用于检查用户是否具有特定角色, 设置特定角色应使用add_role方法。

 FactoryGirl.define do factory :user do name 'Test User' email 'example@example.com' 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