Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用rspec在controller中测试自定义路由_Ruby On Rails_Testing_Rspec_Controller - Fatal编程技术网

Ruby on rails 如何使用rspec在controller中测试自定义路由

Ruby 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"} 如何在控制器规范中明确指定自定义路由?如果您这样声明路由,可能

我已在中定义了自定义路线 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" => "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散列中,否则它将抛出name/no方法或路由错误

结论
  • 对关联的引用必须在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