Как получить текущий путь с помощью строки запроса с помощью Capybara
URL-адрес страницы похож на /people?search=name
в то время как я использовал метод current_path
capybara, он возвращал только /people
.
current_path.should == people_path(:search => 'name')
Но он не говорит
expected: "/people?search=name"
got: "/people"
Как мы можем это пройти? Есть ли способ сделать это?
Ответы
Ответ 1
Я обновил этот ответ, чтобы отразить современные соглашения в capybara. Я думаю, что это идеальный вариант, поскольку это принятый ответ и то, на что многие люди ссылаются при поиске решения. С учетом сказанного правильный способ проверить текущий путь - использовать has_current_path?
-сервер, предоставленный Capybara, как описано здесь: Нажмите здесь
Пример использования:
expect(page).to have_current_path(people_path(search: 'name'))
Как вы можете видеть в документации, доступны другие варианты. Если текущая страница /people?search=name
, но вам все равно, что она на странице /people
вне зависимости от параметра, вы можете отправить опцию only_path
:
expect(page).to have_current_path(people_path, only_path: true)
Кроме того, если вы хотите сравнить весь URL-адрес:
expect(page).to have_current_path(people_url, url: true)
Кредит Тому Уолполу за указание этого метода.
Ответ 2
Я заменил метод _path на _url, чтобы добиться сравнения всех URL-адресов с параметрами.
current_url.should == people_url(:search => 'name')
Ответ 3
Просто обновляя этот вопрос в наше время. Текущей лучшей практикой для проверки current_paths при использовании Capybara 2.5+ является использование совпадения current_path, которое будет использовать поведение ожидания Capybaras для проверки пути. Если вы хотите проверить запрос request_uri (строка пути и запроса)
expect(page).to have_current_path(people_path(:search => 'name'))
Если требуется только часть пути (игнорирование строки запроса)
expect(page).to have_current_path(people_path, only_path: true)
Если вы хотите совместить полный URL
expect(page).to have_current_path(people_url, url: true)
совпадёт строка, которая сравнивается с == или регулярным выражением для соответствия
expect(page).to have_current_path(/search=name/)
Ответ 4
Я знаю, что ответ был выбран, но я просто хотел дать альтернативное решение. Итак:
Чтобы получить путь и querystring, например request.fullpath
в Rails, вы можете сделать:
URI.parse(current_url).request_uri.should == people_path(:search => 'name')
Вы также можете использовать вспомогательный метод в своем тестовом классе (например, ActionDispatch::IntegrationTest
) (что я и сделал):
def current_fullpath
URI.parse(current_url).request_uri
end
Надеюсь, что это поможет.
Ответ 5
EDIT: как упоминалось в Tinynumberes, это не удается для URL-адресов с номером порта. Сохраняя это здесь, если у кого-то еще будет такая же блестящая идея.
current_url[current_host.size..-1]
гольф точно так же (35 символов) как URI.parse(current_url).request_uri
, но потенциально быстрее, потому что нет явного анализа синтаксического анализа URI.
Я сделал запрос на перенос, чтобы добавить это в Capybara по адресу: https://github.com/jnicklas/capybara/pull/1405