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的自定义路由。
解决方法
传递AdminUser实例而非ID
在测试中先获取或创建AdminUser实例,将实例传入路径helper:admin_user = AdminUser.find(6) visit edit_two_factor_admin_admin_user_path(admin_user)强制刷新测试环境路由
在测试的setup块中添加路由刷新代码,确保路由加载完成:setup do Rails.application.reload_routes! end确保测试用户拥有权限
先在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)调整路由定义顺序
在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)直接使用路由字符串测试
绕过路径helper,直接拼接路由字符串验证是否能正常访问:visit "/admin/admin_users/#{admin_user.id}/edit_two_factor"
内容的提问来源于stack exchange,提问作者KozaK
相关产品推荐
相关产品推荐

