You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails集成测试无法识别devise-two-factor添加的Active Admin路由

问题原因及解决方法

可能原因

  • 路径helper参数类型不匹配:edit_two_factor_admin_admin_user_path 期望接收AdminUser实例而非纯ID值,部分场景下(命名空间+自定义路由组合)传ID会触发匹配异常。
  • 测试环境路由加载不及时:测试代码执行时路由表未完成加载,导致helper无法正确解析路由。
  • Active Admin权限拦截:即使路由存在,未授权的请求会被Active Admin拦截,错误被伪装成路由不存在。
  • 路由定义顺序冲突:devise_for与ActiveAdmin.routes的定义顺序颠倒,导致命名空间路由覆盖了devise-two-factor的自定义路由。

解决方法

  1. 传递AdminUser实例而非ID
    在测试中先获取或创建AdminUser实例,将实例传入路径helper:

    admin_user = AdminUser.find(6)
    visit edit_two_factor_admin_admin_user_path(admin_user)
    
  2. 强制刷新测试环境路由
    在测试的setup块中添加路由刷新代码,确保路由加载完成:

    setup do
      Rails.application.reload_routes!
    end
    
  3. 确保测试用户拥有权限
    先在Active Admin的资源配置中开放双因素相关参数的权限:

    # app/admin/admin_users.rb
    permit_params :email, :password, :password_confirmation, :otp_required_for_login, :otp_secret
    

    测试中先登录有权限的管理员用户,再访问目标路由:

    login_as(admin_user, scope: :admin_user)
    visit edit_two_factor_admin_admin_user_path(admin_user)
    
  4. 调整路由定义顺序
    在config/routes.rb中,确保devise_for :admin_users的定义在ActiveAdmin.routes(self)之前:

    devise_for :admin_users, controllers: { 
      sessions: 'admin/sessions', 
      two_factor_authentication: 'admin/two_factor_authentication' 
    }
    ActiveAdmin.routes(self)
    
  5. 直接使用路由字符串测试
    绕过路径helper,直接拼接路由字符串验证是否能正常访问:

    visit "/admin/admin_users/#{admin_user.id}/edit_two_factor"
    

内容的提问来源于stack exchange,提问作者KozaK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:30:38