Ruby on rails 模仿能力班

Ruby on rails 模仿能力班,ruby-on-rails,rspec,cancan,Ruby On Rails,Rspec,Cancan,这是我非常简单的能力课程: class Ability include CanCan::Ability def initialize(user) if user.has_role? :admin can :manage, :control_panel end end end 我应该如何在控制器规范中模拟它 这是我的控制面板控制器: class Admin::ControlPanelController <

这是我非常简单的能力课程:

class Ability
    include CanCan::Ability

    def initialize(user)
        if user.has_role? :admin
            can :manage, :control_panel
        end
    end
end
我应该如何在控制器规范中模拟它

这是我的控制面板控制器:

class Admin::ControlPanelController < ApplicationController
    authorize_resource class: false

    rescue_from CanCan::AccessDenied do |exception|
        redirect_to root_url, danger: "#{exception}"
    end

    def statistics
    end
end
我该如何嘲笑这种能力?以前,我是这样做的:

let(:user){ FactoryGirl.create :user }
expect(controller).to receive(:current_user).and_return user
expect(user).to receive(:has_role?).with(:admin).and_return false
但那是在我使用cancan之前,我正在手动检查用户是否有某个角色。这种行为发生在应用程序控制器中,因此很容易模拟。我很难模仿这个能力课程:(

我想在不同的环境下嘲笑它。我感到有点失落,因为即使我这样做:

expect(Ability).to receive(:asdasdadskjadawd?).at_least(:once)
没有引发错误,尽管如果我拼写“Ability”错误,会引发一个错误,因此它是在模拟类ok…

我认为您不应该模拟
Ability
类,尤其是在控制器测试中。
Ability
类更像配置,而不是代码;它在应用程序期间不会更改。它也是一个简单的类控制器不应该关心的心理状态细节

相反,你应该模仿你的
用户
。看起来你在使用FactoryGirl;你可以用它来模仿你拥有的各种类型的用户:

FactoryGirl.define do
  factory :user do
    name 'Bob'
    email 'bob@example.com
    role 'user'

    trait :admin do
      role 'admin'
    end

    trait :guest do
      role 'guest'
    end
  end
end
然后,如果需要普通用户,可以使用
FactoryGirl.create:user
;如果测试需要管理员,则可以使用
FactoryGirl.create:user,:admin

FactoryGirl.define do
  factory :user do
    name 'Bob'
    email 'bob@example.com
    role 'user'

    trait :admin do
      role 'admin'
    end

    trait :guest do
      role 'guest'
    end
  end
end