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

Rails 3.2控制器测试路由匹配失败及406错误排查求助

Rails 3.2 + Ruby 1.9.3 功能测试路由/406错误排查方案

一、先搞定路由匹配问题

  • 核对测试用例里的请求方法、路径和rake routes输出完全一致,比如路由是GET /api/ubiquo/work_hours,测试里别写成post或者路径少了前缀
  • 在测试里加一行调试代码:puts Rails.application.routes.recognize_path('/api/ubiquo/work_hours', method: :get),直接看路由解析出的controller和action对不对
  • 检查路由定义里的约束,比如有没有constraints限制格式、子域名,测试时得满足这些条件,比如路由要求format: :json,测试里就得加这个参数

二、406错误的具体排查

  • 406是服务器返回不了请求Accept头指定的格式,先看测试请求的Accept头:
    • 要么在请求里显式加accept: 'application/json'(如果API只返回JSON)
    • 要么直接带format: :json参数,比如get :index, format: :json
  • 检查控制器里有没有respond_to :json,对应action里是不是用render json: ...返回,别只支持HTML格式
  • 看看你改的test_helper.rb是不是全局设了错误的Accept头,对比其他正常API测试的配置差异

三、控制器没执行的深层原因

  • 查控制器的前置过滤器(before_filter),会不会有过滤器在控制器执行前就返回响应了,比如权限校验、格式检查的过滤器直接render :nothing => true, status: 406,可以在过滤器里加日志,或者测试里打印响应的headers和body看看
  • 确认测试环境的路由和开发环境一致,执行RAILS_ENV=test rake routes,别让测试环境加载了不同的路由文件
  • 核对命名空间:测试类是不是Api::Ubiquo::WorkHoursControllerTest < ActionController::TestCase,控制器类是不是class Api::Ubiquo::WorkHoursController < Ubiquo::BaseController,嵌套别错了
  • 先写个最简化的测试用例,比如只调用get :index,去掉所有参数,看能不能进控制器,再逐步加参数排查是不是参数的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:51:00