2015-06-21 79 views
1

我有一個驗證模塊,包含在我的控制器中。測試被調用兩次的RSpec模擬

在我的用於管理員操作的控制器中,他們都繼承了AdminController,它們在每個控制器之前調用require_permission :admin以確保當前用戶是管理員。

在我的另一個控制器中,我撥打require_permission? :view_admins來驗證用戶是否有權查看其他管理員的詳細信息。當我運行該規範來測試require_permission :view_admins被調用時,我得到一個錯誤,說require_permission被調用了:admin

如果我改變我的規範,並添加一個測試,require_permission?被調用:admin在我的測試中它被調用:view_admins然後規範通過。有沒有辦法只用:view_admins來測試它呢?

這裏是通過規範:

it 'requires view_admins permission' do 
     expect(controller).to receive(:require_permission).with :admin 
     expect(controller).to receive(:require_permission).with :view_admins 
     get :admins 
end 

和發生故障的規格:

it 'requires view_admins permission' do 
     expect(controller).to receive(:require_permission).with :view_admins 
     get :admins 
end 

回答

1

的最佳方式,國際海事組織,將包裝你的所有管理身份驗證的測試中一個期望:admin調用的上下文。

describe MyController do 
    context "when authenticated" do 
    before do 
     expect(controller).to receive(:require_permission).with :admin 
    end 

    it 'requires view_admins permission' do 
     expect(controller).to receive(:require_permission).with :view_admins 
     get :admins 
    end 
    end 
end 

如果你不想這樣做,那麼你可以使用allow吃的方法的所有意外調用:

it 'requires view_admins permission' do 
    allow(controller).to receive(:require_permission) 
    expect(controller).to receive(:require_permission).with :view_admins 
    get :admins 
end 

話雖這麼說,因爲這些控制器的測試,考慮寫他們作爲驗收測試(哪種測試行爲)而不是單元測試(經常測試實施)。例如:

describe AdminController do 
    context "when logged in as an admin" do 
    let(:permissions) { [:admin] } 
    before { login_with *permissions } 

    describe "#admin" do 
     subject { get :admin } 

     context "with view_pages" do 
     let(:permissions) { [:view_pages] } 
     it { is_expected.to respond_with 200 } 
     end 

     context "without view_pages" do 
     it { is_expected.to respond_with 403 } 
     end 
    end 
    end 
end