2016-07-22 31 views
1

Ich habe eine Rails-Anwendung anzuzeigen, die für den Umgang mit Berichten eine Steuerung ohne Modell/Objekt hat:Testing CanCan Fähigkeit Seiten mit RSpec für Controller ohne Modell

# reports_controller.rb 

class ReportsController < ApplicationController 

    authorize_resource :class => false 

    def index 
    end 

    def report_title 
    # etc. 
    end 

    # etc. 

end 

Benutzerobjekte eine Rolle entweder haben können: Admin, Normal oder Viewer. Ein Administrator kann alles tun, ein normaler Benutzer hat eine Reihe von Regeln, und ein Betrachter kann mit keinem der Objekte der App etwas anfangen, aber er darf alle Berichte sehen.

# 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 

Dies funktioniert wie vorgesehen (wie alle anderen Controller load_and_authorize_resource haben), aber wie gehe ich über die Einheit diese Zeilen in ability.rb testen? Kann ich es mit anderen Unit Tests in function_spec.rb machen, oder muss ich es nur über Requests testen?

Übrigens, das Testen über Anfragen funktioniert, ich frage mich nur, ob es möglich ist, hier stattdessen zu testen.

# 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 

Antwort

1

Ja, sollten Sie in der Lage sein, nur in ability_spec.rb diese Fähigkeit zu testen. Ich denke, das Hinzufügen der folgenden Zeilen funktionieren könnten:

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

wenn Sie authorize_resource :class => ReportsController statt false gesetzt und verwenden can [:index, :report_title, ...], :ReportsController anstelle des Symbols :report.

Ich habe es nicht versucht, also lassen Sie mich wissen, ob es funktioniert hat.

+0

Das hat super funktioniert, danke. – australis