Rails控制器测试中命名空间下的命名路由无法正常工作
Rails控制器测试中命名空间下的命名路由无法正常工作
这个问题的根源是你在控制器测试中错误地使用了路由路径辅助方法,而不是直接指定控制器动作。
在RSpec的控制器测试里,get、post这类方法的第一个参数应该是控制器的动作名称(用符号表示,比如:index),因为控制器测试是直接和控制器类交互,不需要通过路由匹配来定位动作。而你现在传递的admin_profiles_path是一个路径字符串("/admin/profiles"),Rails会把这个字符串当成要调用的动作名,而不是请求路径——这就解释了错误信息里的{:action=>"/admin/profiles", :controller=>"profiles"}:Rails以为你要调用ProfilesController(非命名空间)里的"/admin/profiles"动作,这显然不存在。
而特性测试里用路径辅助方法是没问题的,因为特性测试模拟的是浏览器请求,需要完整的URL路径来走路由流程。
修复方法
把控制器测试里的调用改成直接指定动作符号:
# 错误写法 get admin_profiles_path # 正确写法 get :index
如果需要传递排序参数(比如错误里的order和dir),可以把参数放在第二个位置的params选项里:
get :index, params: { order: 'name', dir: 'asc' }
修改后,你的测试会直接调用Admin::ProfilesController#index动作,不需要触发路由生成,自然就能解决这个UrlGenerationError了。
备注:内容来源于stack exchange,提问作者mrateb
相关产品推荐
相关产品推荐

