我正在尝试使用rspec测试我的cancancan能力
但与测试特定用户可以执行的操作相反,我正在尝试测试用户不应该做什么。
现在,我有一个像这样的上下文块:
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
但是我认为这可能不一定就是我打算做的事情,因为这个测试将会通过,而不是授予该资源的能力之一。
那么,简而言之,有没有直接的方法来测试这种情况?谢谢大家。
答案 0 :(得分:5)
首先,我建议您对@ability
使用explicit subject
,以便您可以使用下面示例中的one-liner syntax。
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