Как проверить пользовательские маршруты в контроллере с помощью rspec

Я определил свой маршрут в маршрутах.

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

В controller_spec.rb,

get :index

дает эту ошибку,

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

Как явно указать пользовательские маршруты в спецификации контроллера?

3 ответа

Решение

Возможно, это поможет, если вы объявите свой маршрут таким образом?

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

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
  • даже если контроллер откликается на:json, он не выдаст ошибок, нет ошибок маршрута
  • необходимо включить в запрос хэш данных, иначе не будут отображаться ошибки совпадения маршрутов

Надеюсь это поможет,

Ура!

Это потому что ты не проходишь мимо 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: {}

это сработало

Другие вопросы по тегам