Как получить текущий путь с помощью строки запроса с помощью 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