Как проверить пользовательские маршруты в контроллере с помощью 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: {}
это сработало