【问题标题】:How to test custom routes in controller with rspec如何使用 rspec 在控制器中测试自定义路由
【发布时间】:2015-03-26 08:21:38
【问题描述】:

我已经在 路线.rb

get "packages/city/:location_id",  to: "packages#index"

controller_spec.rb

get :index

给出这个错误,

ActionController::UrlGenerationError:
   No route matches {:action=>"index", :controller=>"packages"}

如何在控制器规范中明确指定自定义路由?

【问题讨论】:

    标签: ruby-on-rails testing rspec controller


    【解决方案1】:

    如果你这样声明你的路线也许会有所帮助?

    get "packages/city/:location_id" => "packages#index"
    

    记得在规范中提供location_id 参数,例如get :index, location_id: 1.

    【讨论】:

      【解决方案2】:

      2017

      我尝试了上述解决方案,但没有奏效。我得到了:

      ArgumentError:
         unknown keyword: location_id
      

      RSpec 现在似乎需要params 参数。相应的调用如下所示:

      get(:index, params: { location_id: 123 })
      

      【讨论】:

      • 我使用的是:id 而不是:location_id
      【解决方案3】:

      因为你没有通过location_id

      路由被定义为匹配:

      /packages/city/:location_id

      所以为了遵守它,你需要做类似的事情

      get :index, location_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: {}
      

      我明白了

       Failure/Error: patch :update
       ActionController::UrlGenerationError:
         No route matches {:action=>"update", :controller=>"teacher/media_orders"}
      

      但是当我这样做的时候

      patch :update, work_id: 1234, data: {}
      

      成功了

      【讨论】:

        【解决方案4】:

        2019

        在我的控制器规格上解决了同样的错误。尝试了接受和跟进的解决方案,但它们也没有奏效,要么导致没有方法错误,要么持续出现无路由匹配错误。

        像在接受的解决方案中那样直接定义路线也不能满足错误。

        经过大量搜索和一些键盘粉碎测试通过。

        注意事项

        • 控制器用于多态资源
        • 路由嵌套在resources :location, only[:index, :show] do ... end
        • 这是 API 路由,因此仅限 JSON

        解决方案

        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
        

        所以最终它是两种解决方案的组合,但必须将它们放在 params 哈希中,否则它会抛出名称/无方法或路由错误

        结论

        • 对关联的引用必须在参数哈希中
        • 即使控制器 responds_to :json,它也会抛出错误没有路由错误
        • 必须在请求中包含数据哈希,否则不会出现路由匹配错误

        希望对你有帮助,

        干杯!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-11
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多