Тестирование канканских способностей с помощью rspec

Я пытаюсь проверить свои канканские способности, используя rspec

но в отличие от тестирования того, что может делать конкретный пользователь, я пытаюсь проверить, что пользователь не должен делать.

Теперь у меня есть блок контекста, например, так:

context "for a manager" do
  before do
    @manager = FactoryGirl.build(:user, :manager)
    @ability = Ability.new(@manager)
  end

  it "should not be able to create Questions" do
    expect(@ability).not_to be_able_to(:create, Question.new)
  end

  it "should not be able to read Questions" do
    expect(@ability).not_to be_able_to(:read, Question.new)
  end

  it "should not be able to update Questions" do
    expect(@ability).not_to be_able_to(:update, Question.new)
  end

  it "should not be able to delete Questions" do
    expect(@ability).not_to be_able_to(:destroy, Question.new)
  end
end

Это ясно показывает, что пользователь типа manager не должно иметь никакой формы доступа к Question модель.

Есть ли прямой способ записать весь этот блок в один it блок, только с одним expect?

Я думал о написании этого следующим образом:

context "for a manager" do
  before do
    @manager = FactoryGirl.build(:user, :manager)
    @ability = Ability.new(@manager)
  end

  it "should not be able to manage Questions" do
    expect(@ability).not_to be_able_to(:manage, Question.new)
  end
end

Но я думаю, что это не обязательно будет делать то, что я намереваюсь сделать, так как этот тест пройдет столько, сколько одна способность для этого ресурса не предоставлена.

Итак, вкратце, есть ли прямой способ проверить такие сценарии? Спасибо всем.

1 ответ

Решение

Прежде всего, я советую вам использовать явныйsubject за @ability так что вы можете использовать однострочный синтаксис, как в примере ниже.

describe Role do
  subject(:ability){ Ability.new(user) }
  let(:user){ FactoryGirl.build(:user, roles: [role]) }

  context "when is a manager" do
    let(:role){ FactoryGirl.build(:manager_role) }

    it{ is_expected.not_to be_able_to(:create, Question.new) }
    it{ is_expected.not_to be_able_to(:read, Question.new) }
    it{ is_expected.not_to be_able_to(:update, Question.new) }
    it{ is_expected.not_to be_able_to(:destroy, Question.new) }
  end
end

Обновлено после вашего комментария

Но вы также можете суммировать все эти 4 ожидания, чтобы просто

%i[create read update destroy].each do |role|
  it{ is_expected.not_to be_able_to(role, Question.new) }
end
Другие вопросы по тегам