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

时间:2015-03-26 08:21:38

标签: ruby-on-rails testing rspec controller

我已经定义了一个自定义路线 的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 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:7)

2017

我尝试了上面的解决方案,但它们没有用。我得到了:

ArgumentError:
   unknown keyword: location_id

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

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

答案 2 :(得分:2)

这是因为你没有通过let englishLabel = UILabel(CGRectZero) label.text = englishString label.sizeToFit() label.center = CGPointMake(self.view.center.x, 150)

将路线定义为匹配:

location_id

所以为了遵守它,你需要做一些像

这样的事情

/packages/city/:location_id

与Controller规范有相同的问题:


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"}

有效

答案 3 :(得分:-1)

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哈希中,否则会抛出名称/无方法或路由错误

结论

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

希望这会有所帮助

干杯!