Как получить текущий путь со строкой запроса с помощью Capybara



url страницы что-то вроде /people?search=name
в то время как я использовал current_path метод капибары он вернул /people только.



current_path.should == people_path(:search => 'name')


но он не говорил



expected: "/people?search=name"
got: "/people"


как мы можем сделать это пройти? Есть ли способ сделать это?

614   5  

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

    Ничего не найдено.