Я потратил немного времени, пробираясь через CanCan для работы вложенных ресурсов. Он работает так, как ожидалось, в браузере, но я не могу получить соответствующую спецификацию возможностей. Я предполагаю, что это имеет какое-то отношение к тому, как CanCan обрабатывает вложенные маршруты. Любые предложения по правильной проверке отказоустойчивых способностей (отмечены ниже)? Благодарю.Тестирование вложенных возможностей CanCan с помощью RSpec
describe "Network" do
let(:network) { Network.new }
describe "#read" do
it "allows a user that meets the can_read? requirements" do
NetworkManagementPolicy.stub_chain(:new, :can_read?).and_return(true)
ability_for(user).should be_able_to(:read, network)
end
it "denies a user that does not meet the can_read? requirements" do
NetworkManagementPolicy.stub_chain(:new, :can_read?).and_return(false)
ability_for(user).should_not be_able_to(:read, network)
end
describe "Affiliation" do
let(:affiliation) { Affiliation.new }
describe "#manage" do
it "allows a user that meets the can_modify? requirements" do
# NOTE: Not sure why this is failing; Something to do with how
# CanCan handles nested resources?
#
# NetworkManagementPolicy.stub_chain(:new, :can_modify?).and_return(true)
# ability_for(user).should be_able_to(:manage, affiliation)
end
it "denies a user that does not meet the can_modify? requirements" do
NetworkManagementPolicy.stub_chain(:new, :can_modify?).and_return(false)
ability_for(user).should_not be_able_to(:manage, affiliation)
end
end
end
end
end
Класс способности определяет следующее, относящееся к сетям чтения и управлению присоединениями. Класс NetworkManagementPolicy возвращает true/false на основе определенных критериев и работает, как ожидалось. Даже когда вы удаляете вызовы этого класса и возвращаете true/false, я не могу получить спецификации возможностей.
can :read, Network do |network|
can :manage, Affiliation do |affiliation|
NetworkManagementPolicy.new(network).can_modify?(current_user)
end
NetworkManagementPolicy.new(network).can_read?(current_user)
end
Вы уверены, что можете вызывать второй 'can' внутри блока? Я не вижу таких примеров на странице [Определение способностей с блоками] (https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks). Помните, что блок не оценивается до тех пор, пока не будет проверено разрешение. –