it-roy-ru.com

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

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

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

Но это не говорит

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

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

138
kriysna

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

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

201
nzifnab

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

current_url.should == people_url(:search => 'name')
91
Robert Starsi

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

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

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

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

17
Lasse Bunk

Правка: как упоминалось 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