2012-02-16 63 views
3

我正在首次測試CanCan能力,並且難住了。我錯過了一些東西......即使我在罐頭裏面返回false/true:invite_to block,我仍然沒有通過規格。我錯過了使用CanCan匹配器嗎?或存根?或在CanCan中定義能力?如何正確使用RSpec測試CanCan能力

我錯過了什麼?

ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    can :invite_to, Network do |network| 
     network.allows_invitations? && (user.admin? || user.can_send_invitations_for?(network)) 
    end 
    end 
end 

ability_spec.rb

require 'cancan' 
require 'cancan/matchers' 
require_relative '../../app/models/ability.rb' 

class Network; end; 

describe Ability do 
    let(:ability) { Ability.new(@user) } 

    describe "#invite_to, Network" do 
    context "when network level invitations are enabled" do 
     let(:network) { stub(allows_invitations?: true) } 

     it "allows an admin" do 
     @user = stub(admin?: true) 
     ability.should be_able_to(:invite_to, network) 
     end 

     it "allows a member if the member's invitation privileges are enabled" do 
     @user = stub(admin?: false, can_send_invitations_for?: true) 
     ability.should be_able_to(:invite_to, network) 
     end 

     it "denies a member if the member's invitation privileges are disabled" do 
     @user = stub(admin?: false, can_send_invitations_for?: false) 
     ability.should_not be_able_to(:invite_to, network) 
     end 
    end 
    end 
end 

故障

1) Ability#invite_to, Network when network level invitations are enabled allows an admin 
    Failure/Error: ability.should be_able_to(:invite_to, network) 
     expected to be able to :invite_to #<RSpec::Mocks::Mock:0x3fe3ed90444c @name=nil> 
    # ./spec/models/ability_spec.rb:16:in `block (4 levels) in <top (required)>' 

    2) Ability#invite_to, Network when network level invitations are enabled allows a member if the member's invitation privileges are enabled 
    Failure/Error: ability.should be_able_to(:invite_to, network) 
     expected to be able to :invite_to #<RSpec::Mocks::Mock:0x3fe3edc27408 @name=nil> 
    # ./spec/models/ability_spec.rb:21:in `block (4 levels) in <top (required)>' 

回答

4
let(:network) do 
    n = Network.new 
    n.stub!(:allows_invitations? => true) 
    n 
    end 

如果您在編寫代碼時運行代碼,Can塊內的代碼永遠不會到達。你對存根的調用返回一個RSpec :: Mocks :: Mock類的對象;它必須是CanCan的網絡類才能應用該規則。

+0

優秀的捕獲。我只是在文檔中關於它在給出類而不是實例時跳過塊的內容來閱讀該部分。雖然它沒有點擊。謝謝。 – 2012-02-16 14:01:21