执行Rails测试时遇302重定向错误,期望2XX成功响应
问题拆解与解决方案
嘿,这个问题我太熟悉了,咱们一步步来理清楚:
错误根源
你遇到的这个302重定向错误,本质是**OpeningsController的new接口被身份验证拦截了**。大概率是你的控制器里加了类似Devise的authenticate_user!这样的前置过滤器,要求用户必须登录才能访问这个页面。
测试代码里直接访问new_opening_url时,没有任何已登录的用户,系统就自动把请求重定向到登录页面(也就是你看到的/users/sign_in),但你的测试预期的是2XX成功响应,自然就触发报错了。
两种解决思路(按需选择)
思路一:如果new页面确实需要登录才能访问
那你得在测试里先创建一个测试用户,并且完成登录操作,再去访问接口。假设你用的是Devise,修改测试代码如下:
class OpeningsControllerTest < ActionDispatch::IntegrationTest setup do # 先创建一个合法的测试用户 @user = User.create!(email: 'test_user@example.com', password: 'secure_password123') # 调用Devise的登录方法 sign_in @user end test "should get new" do get new_opening_url assert_response :success end end
提示:如果你的用户模型不是User,或者项目用了自定义的登录逻辑,记得对应调整创建用户和登录的代码哦。
思路二:如果new页面应该允许匿名访问
那你需要在OpeningsController里,给new action跳过身份验证检查。修改控制器代码:
class OpeningsController < ApplicationController # 除了new action,其他都需要登录验证 before_action :authenticate_user!, except: [:new] # 或者反过来,只给特定action加验证: # before_action :authenticate_user!, only: [:create, :edit, :update, :destroy] def new # 你的业务逻辑代码 end # 其他控制器方法... end
验证修改
改完之后,重新运行测试命令:
RAILS_ENV=test rails test test/controllers
只要逻辑没问题,测试应该就能顺利通过啦。
内容的提问来源于stack exchange,提问作者pratik Rathod
相关产品推荐
相关产品推荐

