测试CanCan能否使用RSpec查看没有模型的控制器的页面

时间:2016-07-22 18:16:10

标签: ruby-on-rails ruby rspec-rails cancan cancancan

我有一个Rails应用程序,它有一个没有用于处理报告的模型/对象的控制器:

# reports_controller.rb

class ReportsController < ApplicationController

  authorize_resource :class => false

  def index
  end

  def report_title
    # etc.
  end

  # etc.

end

用户对象可以具有以下任一角色:admin,normal或viewer。管理员可以做任何事情,普通用户有一堆规则,观众可以无法对任何应用程序的对象做任何事情,但是他们可以查看所有报告。

# ability.rb

def initialize(user)
  if user.admin?
    can :manage, :all

  elsif user.normal?
    # stuff according to business rules...

  elsif user.viewer?
    can [:index, :report_title, ...], :report
  end
end

这可以按预期工作(因为所有其他控制器都有load_and_authorize_resource),但是如何在ability.rb中对这些行进行单元测试呢?我可以使用其他单元测试在ability_spec.rb中执行此操作,还是仅通过请求进行测试?

顺便说一下,通过请求进行测试确实有效,我只是想知道是否可以在这里进行测试。

# ability_spec.rb

RSpec.describe User do
  describe "abilities" do
    subject(:ability){ Ability.new(user) }

    CRUD = [:create, :read, :update, :destroy]
    ALL_MODELS = # a list of models

    # ...

    context "a report viewer" do
      let(:user){ FactoryGirl.create(:user, :viewer) }

      it 'cannot do anything with any objects' do
        ALL_MODELS.each do |object|
          CRUD.each do |action|
            should_not be_able_to(action, object)
          end
        end
      end

      it 'can access all the report actions' do
        # ???
      end
    end
  end
end

1 个答案:

答案 0 :(得分:1)

是的,您应该能够在ability_spec.rb中测试该功能。我认为添加以下行可能会有效:

it 'can access all the report actions' do
  should be_able_to :index, ReportsController
  should be_able_to :report_title, ReportsController
end

如果您设置authorize_resource :class => ReportsController而不是false并使用can [:index, :report_title, ...], :ReportsController而不是符号:report

我没试过,所以请告诉我它是否有用。