Ruby on rails 如何使用rspec在controller中测试自定义路由
我已在中定义了自定义路线 routes.rbRuby on rails 如何使用rspec在controller中测试自定义路由,ruby-on-rails,testing,rspec,controller,Ruby On Rails,Testing,Rspec,Controller,我已在中定义了自定义路线 routes.rb get "packages/city/:location_id", to: "packages#index" 在控制器规范rb中 get :index 给出了这个错误 ActionController::UrlGenerationError: No route matches {:action=>"index", :controller=>"packages"} 如何在控制器规范中明确指定自定义路由?如果您这样声明路由,可能
get "packages/city/:location_id", to: "packages#index"
在控制器规范rb
中
get :index
给出了这个错误
ActionController::UrlGenerationError:
No route matches {:action=>"index", :controller=>"packages"}
如何在控制器规范中明确指定自定义路由?如果您这样声明路由,可能会有所帮助
get "packages/city/:location_id" => "packages#index"
请记住在规范中提供一个
location\u id
参数,例如get:index,location\u id:1
这是因为您没有传递location\u id
路线定义为匹配:
/包裹/城市/:位置\u id
因此,为了遵守它,你需要做如下的事情
获取:索引,位置\u id:1234
控制器规格存在相同问题:
# rake routes | grep media_order
teacher_work_media_orders PATCH /teacher/works/:work_id/media_orders(.:format) teacher/media_orders#update
当我这样做的时候:
# spec/controller/teacher/media_orders_controller
patch :update data: {}
我得到
但当我这么做的时候
patch :update, work_id: 1234, data: {}
这在2017年起了作用
我尝试了上述解决方案,但都不起作用。我得到:
ArgumentError:
unknown keyword: location_id
RSpec现在似乎需要一个params
参数。相应的调用如下所示:
get(:index, params: { location_id: 123 })
2019
在我的控制器规格上处理同样的错误。尝试接受并跟进解决方案,但也不起作用,要么导致无方法错误,要么持续存在无路由匹配错误
在接受的解决方案中直接定义路由也不能满足这些错误
经过大量的搜索和一些键盘粉碎测试通过
注意事项
- 控制器用于多态资源
- 路由嵌套在
resources:location中,仅[:index,:show]do。。。结束
- 这是API路由,因此仅限于JSON
- 对关联的引用必须在params散列中
- 即使控制器响应:json,它也会抛出错误,而不会抛出路由错误
- 必须在请求中包含数据哈希,否则不会出现路由匹配错误
干杯 我用的是
:id
而不是:location\u id
get(:index, params: { location_id: 123 })
let(:location) do
create(:location)
end
shared_examples("a user who can't manage locations") do
describe 'GET #index' do
it 'denies access' do
get :index, params:{location_id: location.locationable.id, format: :json}
expect(response).to have_http_status :unauthorized
end
end
end