Как получить текущий путь со строкой запроса, используя Capybara - PullRequest
138 голосов
/ 08 марта 2011

URL страницы похож на /people?search=name пока я использовал current_path метод капибары, он возвратил только /people.

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

Но он не может сказать,

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

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

Ответы [ 5 ]

203 голосов
/ 08 марта 2011

Я обновил этот ответ, чтобы отразить современные соглашения в капибаре. Я думаю, что это идеально, так как это принятый ответ, и на что многие люди обращаются, когда ищут решение. С учетом вышесказанного, правильный способ проверки текущего пути - использовать 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)

Благодарим Тома Уолпола за указание на этот метод.

91 голосов
/ 20 ноября 2011

Я заменил метод _path на _url, чтобы сравнить полные URL с параметрами.

current_url.should == people_url(:search => 'name')
49 голосов
/ 20 ноября 2015

Просто обновляю этот вопрос для современности.В настоящее время рекомендуется проверять значения 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) # 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

сопоставитель получит строку, которая сравнивается с ==, или регулярное выражение для сопоставления с

expect(page).to have_current_path(/search=name/)
17 голосов
/ 17 октября 2013

Я знаю, что ответ был выбран, но я просто хотел дать альтернативное решение. Итак:

Чтобы получить путь и строку запроса, как 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

Надеюсь, это поможет.

0 голосов

РЕДАКТИРОВАТЬ: как упоминалось Tinynumberes, это не работает для URL с номером порта.Сохраните его здесь на тот случай, если у кого-то есть такая же блестящая идея.

current_url[current_host.size..-1]

golfs точно так же (35 символов), как и URI.parse(current_url).request_uri, но потенциально быстрее, потому что не требуется явный анализ URI.*

Я сделал запрос на добавление в Capybara по адресу: https://github.com/jnicklas/capybara/pull/1405

...