0

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

これは、 type のユーザーがモデルmanagerへのいかなる形式のアクセス権も持ってはならないことを明確に示しています。Question

itこのブロック全体を 1 つのブロックだけで、1 つのブロックに直接書き込む方法はあり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 つが付与されていないのと同じくらい合格するため、これは必ずしも意図したとおりに機能するとは限らないと考えています。

要するに、そのようなシナリオをテストする直接的な方法はありますか? ありがとうございます。

4

1 に答える 1

6

まず、明示的なsubjectforを使用して、以下の例のようにワンライナー構文@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
于 2015-09-13T20:04:31.030 に答える