我正在尝试编写一个测试,以确保未经身份验证的用户无法访问特定页面。这是我的规范
it "redirects to the sign in page for unauthenticated users" do
bob = Fabricate(:user)
sign_out bob
carolina_skiff = Fabricate(:boat_brand)
get :edit, id: carolina_skiff.id
expect(response).to redirect_to new_user_session_path
end
当我运行它时,我得到了这个错误。
Failure/Error: get :edit, id: carolina_skiff.id
ArgumentError:
uncaught throw :warden
我好像无法注销用户。我有另一个规范,我正在登录一个用户并且那个工作正常。
it "sets the @boat_brand" do
bob = Fabricate(:user)
sign_in bob
carolina_skiff = Fabricate(:boat_brand)
get :edit, id: carolina_skiff.id
expect(assigns(:boat_brand)).to eq(carolina_skiff)
end
如有任何帮助,我们将不胜感激。
最佳答案
我不知道它是否有帮助,但我在登录后尝试对设计重定向进行功能测试时遇到了类似的问题。这些是重点:
- 准确测试
Devise::SessionsController
(不是例如 UsersController)或编写test Devise::SessionsController
- 强制正确映射,如文档中所述:https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-(and-RSpec)
- 包括 Devise::TestHelpers
带有重定向的示例测试如下所示:
require "test_helper"
describe 'Devise::SessionsControllerTest' do
# If you want different name in describe block write:
# tests Devise::SessionsController
include Devise::TestHelpers
test "should redirect to page_x after logged in" do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = users :user
sign_in user
get :new
assert_redirected_to orders_path
end
end
其中 :user
只是常规有效的设计用户,而 orders_path
是登录后的重定向路径。这不是准确的登录测试,而是重定向测试来自已登录用户的登录页面(准确地说)。
关于ruby-on-rails - Devise 和 Rspec - 为未经身份验证的用户测试重定向时 Controller 测试出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26180375/