2015-09-06 238 views
-1

我想我cancancan能力使用測試cancancan能力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 

但我想,這可能不一定做我打算就這樣做,因爲這個測試將通過是多達一沒有授予該資源的能力。

總之,是否有直接的方法來測試這種情況?謝謝大家。

回答

4

首先,我建議您使用explicit subject作爲@ability,以便您可以使用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 
+0

謝謝,@Nuno科斯塔。然而,我正在尋找一種方法來測試'不能做'的能力,而不是'能做'的能力。 例如: '它{is_expected.not_to be_able_to(:管理,Question.new)}' ,而不是: '它{is_expected.to be_able_to(:管理,Question.new)}' –

+0

我已經更新了我的答案。檢查這4個操作可能還不夠,因爲您可能在控制器中有額外的操作。請參閱https://github.com/CanCanCommunity/cancancan/wiki/Action-Aliases –