2013-10-28 53 views
8

沒有登錄的用戶這是一個before_filter一個很典型的控制器,它重定向到登錄頁面時,一個不登錄的用戶(也叫做客人)嘗試一個規範訪問/projects/new「未捕獲拋出:監獄長」,當測試重定向爲

describe ProjectsController do 
    (...) 

    describe "GET new" do 
    context 'when not logged in' do 
     before { sign_in_nobody } 

     context 'creating project' do 
     before { get :new } 

     it 'denies access' do 
      expect(response).to be_redirect 
     end 
     end 
    end 
    end 
end 

我已經specced訪問:index:show:new的所有可能結果客人用戶管理員superadmins。我沒有使用記錄或訪客用戶,管理員或沒有任何問題 - 但這實際上是這個規範第一次觸及一個涉及Devise的before_filter :autheticate_user!的行爲,並且它在這一點上失敗了。

Failures: 

1) ProjectsController GET new when not logged in creating project denies access 
    Failure/Error: get :new 
    ArgumentError: 
    uncaught throw :warden 
    # ./spec/controllers/projects_controller_spec.rb:344:in `block (5 levels) in <top (required)>' 

我搜索的答案,問題:「如何正確測試未認證 -

正如你可能已經懷疑規範甚至沒有達到expect(response).to be_redirect,之前拋出一個噓聲像配合(guest)rspec和devise的用戶「,但每個人只會談論實際記錄用戶在設計RSpec使用的問題。 我正是如此解決的問題:

#spec/support/devise_authenticators.rb 
include Devise::TestHelpers 

def sign_in_nobody 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in User.new 
end 

def sign_in_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in FactoryGirl.create(:user) 
end 

但是它不是在該日誌記錄失敗在這裏,它是「被未登錄」。 到目前爲止,我一無所獲,我知道人們以某種方式測試這些情況。

現在我使用的是外觀圖釋:

before { sign_in_nobody } 

context 'creating project' do 
    it 'denies access' do 
    expect{ get :new }.to raise_exception("uncaught throw :warden") 
    end 
end 

但即使壽它實際上正確(uncaught throw :warden僅發生authenticate_user!失敗,所以它可以作爲一個期望)理論,感覺很髒。

任何想法如何正確地做到這一點?

(...也許我不應該在所有的測試這個,看到的before_filter authenticate_user!正確性是如何設計的責任不是我的?)

+0

這是[SO11152671]重複(http://stackoverflow.com/questions/11152671/devise-warden-error-thrown - 用於進行身份驗證用戶合官能軌測試#答案-20725510)。我在那裏貼了一個完整的答案。總之,您需要在實際的ControllerTest類中而不是在test_helper.rb中添加Devise測試助手和Warden測試助手的包含。 – xeorem

回答

4

應該只是工作。我花了一段時間修復了同樣的問題,結果證明我們有一個測試助手替代了控制器測試的process。設計也覆蓋它到catch :warden,所以我只需要include Devise::TestHelpers之前包括默認參數模塊。

對於我在說什麼,當我說我們推翻process的例子,看看this answer介紹如何設置默認PARAMS包括format: json

+0

我有同樣的錯誤,但我不明白我應該在哪裏插入'include Devise :: TestHelpers'。你可以幫我嗎?謝謝 – Rowandish

+0

您可以在您的測試課程或所有控制器的助手中完成。例如,請參閱https://github.com/plataformatec/devise/wiki/How-To:-Controllers-tests-with-Rails-3-(and-rspec)上關於Test :: Unit和RSpec的前2個標題。 –

+1

謝謝!儘管我們有正確的測試助手,但是我在'uncaught throw:warden'錯誤被提出的時候遇到了這個問題。原來,我們有一個'default_params'助手就像你鏈接到的那個助手一樣,這導致了問題。 – Percy

1

,該課程是uncaught throw :warden發生在authenticate_user!失敗。

因此,找出爲什麼您的用戶身份驗證失敗,並且您將解決您的問題。

1

我也有類似的問題,我解決了它這樣的:

e = catch(:warden) { get root_url } 
expect(e[:message]).to be(:not_activated)