Ruby on Rails:测试HTTP成功状态时出现RSpec路由错误
解决Ruby on Rails中RSpec控制器测试的路由错误问题
你遇到的路由错误核心原因很明确:**RESTful风格的show和edit动作必须接收资源的标识符参数(比如id)**才能匹配到正确的路由。Rails的路由规则里,这两个动作的路径是/wikis/:id和/wikis/:id/edit,没有:id参数的话,路由系统根本找不到对应的处理动作。
我来帮你一步步修正测试代码,同时给出排查要点:
1. 修正测试用例的参数传递
首先给get方法传入wiki的id参数,让Rails能匹配到对应路由。另外,edit动作通常需要用户认证(比如只有wiki的创建者才能编辑),如果你的控制器用了Devise这类认证工具,记得先在测试中登录用户:
require 'rails/all' RSpec.describe WikisController, type: :controller do let(:user) { User.create!(email: "user@email.com", password: "password") } let(:wiki) { Wiki.create!(title: "New Wiki Title", body: "New Wiki Body", private: false, user: user) } describe "GET show" do it "returns http success" do # 传入wiki的id参数,匹配/wikis/:id路由 get :show, params: { id: wiki.id } expect(response).to have_http_status(:success) end end describe "GET edit" do it "returns http success" do # 先登录用户(如果控制器有认证要求的话) sign_in user # 同样传入id参数,匹配/wikis/:id/edit路由 get :edit, params: { id: wiki.id } expect(response).to have_http_status(:success) end end end
2. 确认路由配置是否正确
如果修正参数后还是报错,先检查你的路由配置:
- 打开
config/routes.rb,确认是否有resources :wikis这行代码(这会自动生成RESTful的7个动作路由)。 - 在终端运行
rails routes命令,查看输出里是否有以下两行:
如果没有的话,说明路由没有正确配置,需要调整wiki GET /wikis/:id(.:format) wikis#show GET /wikis/:id/edit(.:format) wikis#editroutes.rb。
3. 额外注意事项
- 如果你的
Wiki模型重写了to_param方法(比如用slug代替id),测试中可以直接传wiki对象,Rails会自动调用to_param获取标识符:get :show, params: { id: wiki }。 - 如果控制器有额外的权限校验(比如只有作者能编辑),测试中要确保登录的用户是wiki的创建者(也就是我们定义的
user变量),避免出现授权错误。
内容的提问来源于stack exchange,提问作者Claire Meadows
相关产品推荐
相关产品推荐

