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
相关产品推荐
相关产品推荐

