Rails 8内置认证下如何用Minitest测试已登录用户的控制器
Rails 8内置认证Minitest测试302重定向问题解决
使用Rails 8内置认证功能时,Minitest控制器测试出现302重定向到登录页,核心原因是测试中的登录操作未正确生效,以下是具体解决步骤:
1. 修正登录请求路由
Rails 8内置认证的登录提交接口是session_url(POST方法),new_session_url仅用于GET请求展示登录页面。修改你的sign_in方法:
def sign_in(user) post session_url, params: { user: { email_address: user.email_address, password: "password" } } end
2. 确保参数嵌套结构正确
Rails内置认证默认将登录参数嵌套在user键下,若你修改过用户模型的登录字段为email_address,需同步在认证配置中指定:
在config/initializers/auth.rb添加或修改:
Rails.application.config.auth do |config| config.authentication_keys = [:email_address] end
3. 跟进登录后的重定向
登录请求会返回302重定向,若不跟进重定向,后续请求无法携带登录session。更新setup方法:
setup do @category = categories(:one) @user = users(:one) sign_in @user follow_redirect! # 跟进重定向,保持登录状态 end
也可以添加断言验证登录成功:
setup do @category = categories(:one) @user = users(:one) sign_in @user assert_response :redirect # 确认登录请求返回重定向 follow_redirect! end
4. 验证Fixture密码有效性
确认fixture中的密码摘要与测试用密码匹配,可新增测试用例验证:
test "user fixture password is valid" do assert_equal "password", BCrypt::Password.new(users(:one).password_digest) end
内容的提问来源于stack exchange,提问作者cyberfly
相关产品推荐
相关产品推荐

