Тестирование вложенных способностей CanCan с RSpec - PullRequest
3 голосов
/ 25 февраля 2012

Я потратил немного времени, копаясь в CanCan, чтобы заставить работать вложенные ресурсы.Он работает так, как и ожидалось в браузере, но я не могу передать соответствующую спецификацию способностей.Я предполагаю, что это как-то связано с тем, как CanCan обрабатывает вложенные маршруты.Любые предложения о том, как правильно протестировать способности, не соответствующие требованиям (отмечено ниже)?Спасибо.

  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 возвращает истину / ложь на основе определенных критериев и работает как ожидалось.Даже когда я убираю вызовы этого класса и трудно возвращаю истину / ложь, я не могу передать спецификации способностей.

  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

1 Ответ

0 голосов
/ 09 октября 2013

Нам нужно больше подробностей о ваших моделях и "can_read?" условия, чтобы правильно ответить на этот вопрос. Я не уверен, как ваша модель принадлежности связана с NetworkManagementPolicy или Network.

Однако, учитывая, что сеть has_many network_management_polices и что каждая принадлежность привязана к пользователю и сети со стандартными соглашениями о рельсах, это должно заставить вас двигаться.

class NetworkManagementPolicyController < ApplicationController
    load_and_authorize_resource :network
    load_and_authorize_resource :network_management_policy, through: :network
end

can :manage, NetworkManagementPolicy, network: { affiliations: { user_id: current_user.id} }
...