Тестирование канканских способностей с помощью 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