嘲笑能力等级

时间:2014-09-04 11:11:39

标签: 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 < ApplicationController
    authorize_resource class: false

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

    def statistics
    end
end

这是我的control_panel控制器规范:

describe '#statistics:' do
    let(:request){ get :statistics }

    context 'When guest;' do
        before do
            # HOW SHOULD I MOCK HERE?
        end 

        describe 'response' do
            subject { response }

            its(:status){ should eq 302 }
            its(:content_type){ should eq 'text/html' }
            it{ should redirect_to root_path }
        end

        describe 'flash' do
            specify { expect( flash[:danger] ).to eq "You do not have sufficient priviledges to access the admin area. Try logging in with an account that has admin priviledges." }
        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)

没有引起任何错误,但是如果我拼写了&#39; Ability&#39;这是错误的,所以它嘲笑班级好......

1 个答案:

答案 0 :(得分:0)

我不认为你应该嘲笑Ability类,特别是在控制器测试中。 Ability类更像是配置而不是代码;在申请期间它不会改变。它也是控制器不应该关心的实现细节。

相反,你应该嘲笑你的Users。看起来你正在使用FactoryGirl;您可以使用FactoryGirl's traits来模拟您拥有的各种用户:

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