使用Ruby2.3.1+Rails5.0.7运行RSpec时遇路由匹配错误求助
解决Rails 5.0.7 + Ruby 2.3.1下RSpec路由匹配错误问题
嘿,我之前也踩过这个坑,咱们一步步来搞定它。你碰到的ActionController::UrlGenerationError本质是RSpec控制器测试里的路由调用方式不对,导致Rails找不到对应的路由映射。
先把你的错误信息明确出来:
失败案例:
- AuthenticationController POST /auth/login 当请求合法时返回认证令牌
错误详情:before { post 'auth/login', params: valid_credentials , headers: headers }
触发ActionController::UrlGenerationError: No route matches {:action=>"auth/login", :controller=>"authentication", :email=>"foo@bar.com", :password=>"foobar"}
问题根源
在Rails控制器测试中,post方法的第一个参数应该用路由助手方法(比如login_path),而不是直接传字符串形式的路径'auth/login'——除非你在路由里显式定义了对应的as选项,否则Rails没法把字符串路径正确映射到控制器和动作上。
解决方案
先确认路由定义
打开你的config/routes.rb,确保POST/auth/login的路由是这样定义的(注意as选项,它会生成路由助手):post '/auth/login', to: 'authentication#login', as: :login如果是带命名空间的路由(比如
namespace :auth),那应该是:namespace :auth do post 'login', to: 'authentication#login', as: :login end修改RSpec测试代码
把测试里的post 'auth/login'改成对应的路由助手:- 如果是普通路由:
before { post login_path, params: valid_credentials, headers: headers } - 如果是命名空间路由:
before { post auth_login_path, params: valid_credentials, headers: headers }
要是你不想用路由助手,也可以直接指定控制器和动作的哈希形式:
before { post :login, params: valid_credentials, headers: headers }- 如果是普通路由:
验证路由是否存在
在终端跑rails routes命令,检查输出里有没有对应的路由条目,比如:login POST /auth/login(.:format) authentication#login这能确认你的路由确实被正确加载了。
额外排查点
- 检查路由文件里的拼写:控制器名是不是
authentication(全小写),动作是不是login,别写错了 - 虽然这个错误和参数内容无关,但还是确认下
valid_credentials的键是对的(比如:email和:password) - Rails 5+的控制器测试里,参数必须用
params:键明确传递,你已经这么做了,这点没问题
内容的提问来源于stack exchange,提问作者Davie Overman
相关产品推荐
相关产品推荐

