如何使用rspec测试控制器中的自定义路由

13

我已经在routes.rb中定义了一个自定义路由。

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

controller_spec.rb文件中,

get :index

产生这个错误,

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

如何在控制器测试中显式指定自定义路由?

4个回答

15

也许这样声明您的路由会有帮助?

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

请在规格中提供location_id参数,例如:get :index, location_id: 1


10

2017

我尝试了以上的解决方案,但它们都不起作用。我得到了:

ArgumentError:
   unknown keyword: location_id

看起来RSpec现在需要一个params参数。相应的调用将如下所示:

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

我使用了:id而不是:location_id - hcarreras

2

这是因为您未传递location_id

路由定义匹配如下:

/packages/city/:location_id

因此,为了符合它,您需要执行以下操作:

get :index, location_id: 1234

在Controller规范中也遇到了同样的问题:

# 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: {}

I got

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

但是当我这样做时

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

那个有效。

2

2019

我也在处理控制器规范时遇到了同样的错误。尝试了接受和后续的解决方案,但它们也无法工作,一些导致了no method error,而其他一些持久化了no route match error。

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

经过大量搜索和一些键盘敲打测试,问题得以解决。

需要注意的事项

  • 控制器是用于多态资源的
  • 路由嵌套在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哈希中,否则会出现名称/无方法或路由错误。
结论:
- 关联的引用必须在params哈希中。 - 即使控制器响应:json,也会抛出错误路由错误。 - 必须在请求中包含数据哈希,否则将出现无路由匹配错误。
希望这可以帮助你,
祝好!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接