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
Das hat super funktioniert, danke. – australis