Как получить текущий путь со строкой запроса с помощью Capybara
url страницы что-то вроде /people?search=name
в то время как я использовал current_path метод капибары он вернул /people только.
current_path.should == people_path(:search => 'name')
но он не говорил
expected: "/people?search=name"
got: "/people"
как мы можем сделать это пройти? Есть ли способ сделать это?
5 ответов:
я обновил этот ответ, чтобы отразить современные конвенции в капибаре. Я думаю, что это идеально, так как это принятый ответ, и то, что многие люди ссылаются при поиске решения. С учетом сказанного, правильный способ проверить текущий путь-использовать
has_current_path?matcher предоставлено Capybara, как описано здесь:Нажмите Здесьпример использования:
expect(page).to have_current_path(people_path(search: 'name'))как вы можете видеть в документации, другие варианты доступны. Если текущая страница
/people?search=nameно вас волнует только то, что он находится на/peopleстраница независимо от param, вы можете отправить :expect(page).to have_current_path(people_path, only_path: true)кроме того, если вы хотите сравнить весь url:
expect(page).to have_current_path(people_url, url: true)спасибо тому Уолполу за указание на этот метод.
Я заменил метод _path на _url для достижения сравнения полных URL-адресов с параметрами.
current_url.should == people_url(:search => 'name')
просто обновляя этот вопрос для современности. В настоящее время для проверки current_paths при использовании Capybara 2.5+ рекомендуется использовать сопоставитель current_path, который будет использовать поведение ожидания капибар для проверки пути. Если вы хотите проверить против request_uri (путь и строка запроса)
expect(page).to have_current_path(people_path(:search => 'name'))если только требуется часть пути (игнорируя строку запроса)
expect(page).to have_current_path(people_path, only_path: true) # Capybara < 2.16 expect(page).to have_current_path(people_path, ignore_query: true) # Capybara >= 2.16если хотите, чтобы соответствовать полный url
expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16 expect(page).to have_current_path(people_url) # Capybara >= 2.16сопоставитель примет a строка, которая сравнивается с == или регулярное выражение, чтобы соответствовать против
expect(page).to have_current_path(/search=name/)
Я знаю, что ответ был выбран, но я просто хотел дать альтернативное решение. Итак:
чтобы получить путь и строку запроса, например
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надеюсь, что это помогает.
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
Comments