繁体   English   中英

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

[英]How to test custom routes in controller with rspec

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

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

controller_spec.rb

get :index

给出了这个错误,

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

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

如果您宣布这样的路线,也许会有所帮助?

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

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

2017年

我尝试了上面的解决方案,但他们没有工作。 我有:

ArgumentError:
   unknown keyword: location_id

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

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

这是因为你没有传递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: {}

我有

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

但是当我这样做的时候

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

有效

2019

在我的控制器规格上解决了同样的错误。 尝试接受和跟进解决方案,但他们也没有工作,或导致没有方法错误或持续无路由匹配错误。

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

经过多次搜索和一些键盘粉碎测试通过。

注意事项

  • controller用于多态资源
  • 路由嵌套在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哈希中
  • 即使控制器响应_s:json,它也会抛出错误,没有路由错误
  • 必须在请求中包含数据哈希,否则不会出现路由匹配错误

希望这可以帮助,

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM