4
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

そして私の工場

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

それらのモックがすべての役割を受け取る必要がありますが、今は学生の役割しかできません

rspecでの私のテスト

subject(:ability){ Ability.new(user) }
let(:user){ nil }

 context "when is an User" do
 let(:user) { FactoryGirl.create(:user) } 

何が起こっているのか: 紙が 1 つしかない rspec でしかテストできませんが、すべての cancan でテストしたいので、さまざまな役割に対してこれらすべての可能性を備えたファクトリを作成する必要があります

4

3 に答える 3

7

最初の解決策

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

次に、これらの特性を次のように使用して組み合わせることができます。

# Create a student
create :user, :student

# Create a user who is both professor and admin
create :user, :professor, :admin

2 番目の解決策

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

その後:

# Create a student
create :user, role: :student

2 番目のソリューションでは、ロールをそのまま組み合わせることはできないことに注意してください。ただし、配列を使用してこれを実現できます。

于 2014-02-13T22:37:18.767 に答える