沒有登錄的用戶這是一個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!
正確性是如何設計的責任不是我的?)
這是[SO11152671]重複(http://stackoverflow.com/questions/11152671/devise-warden-error-thrown - 用於進行身份驗證用戶合官能軌測試#答案-20725510)。我在那裏貼了一個完整的答案。總之,您需要在實際的ControllerTest類中而不是在test_helper.rb中添加Devise測試助手和Warden測試助手的包含。 – xeorem