使用rspec测试cancancan能力

时间:2015-09-06 01:44:22

标签: ruby-on-rails rspec rspec-rails cancancan

我正在尝试使用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

但是我认为这可能不一定就是我打算做的事情,因为这个测试将会通过,而不是授予该资源的能力之一。

那么,简而言之,有没有直接的方法来测试这种情况?谢谢大家。

1 个答案:

答案 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