thi*_*vsk 3 ruby ruby-on-rails cancan rolify factory-bot
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user
if user.has_role? :student
can :create, Atendimento
end
if user.has_role? :professor
can :create, Atendimento
end
if user.has_role? :administrative
can [:read, :create], [Atendimento]
can [:edit, :update], Atendimento
can :manage, [Type, Place]
end
if user.has_role? :admin
can :manage, :all
end
end
end
Run Code Online (Sandbox Code Playgroud)
和我的工厂
FactoryGirl.define do
factory :user do |f|
f.name "Alessandro"
f.username "alessandrocb"
f.matricula "123456789"
f.password "123456789"
f.password_confirmation "123456789"
f.after(:create) {|user| user.add_role(:student)}
end
Run Code Online (Sandbox Code Playgroud)
我需要那些模拟获得所有角色,但现在我只能学生角色
我用rspec测试
subject(:ability){ Ability.new(user) }
let(:user){ nil }
context "when is an User" do
let(:user) { FactoryGirl.create(:user) }
Run Code Online (Sandbox Code Playgroud)
发生的事情是这样的:我只能用只有1张纸的rspec测试,但是想用所有的cancan进行测试,我需要为不同的角色创建具有所有这些可能性的工厂
FactoryGirl.define do
factory :user do
name "Alessandro"
username "alessandrocb"
(...)
trait :student do
after(:create) {|user| user.add_role(:student)}
end
trait :professor do
after(:create) {|user| user.add_role(:professor)}
end
trait :administrative do
after(:create) {|user| user.add_role(:administrative)}
end
trait :admin do
after(:create) {|user| user.add_role(:admin)}
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用和组合这些特征,如下所示:
# Create a student
create :user, :student
# Create a user who is both professor and admin
create :user, :professor, :admin
Run Code Online (Sandbox Code Playgroud)
FactoryGirl.define do
factory :user do
name "Alessandro"
username "alessandrocb"
(...)
ignore do
role
end
after(:create) do |user, params|
user.add_role(params.role) if params.role
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后:
# Create a student
create :user, role: :student
Run Code Online (Sandbox Code Playgroud)
请注意,第二个解决方案不允许您按原样组合角色.但是你可以使用数组来实现这一目标.
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |