Як отримати поточний шлях за допомогою рядка запиту за допомогою Capybara


144

URL-адреса сторінки щось подібне, /people?search=name поки я використовував current_pathметод capybara, він /peopleлише повертався .

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

Але це не вдається сказати

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

Як ми можемо змусити його пройти? Чи є спосіб це зробити?


10
"/people?search=name" - це не шлях . "/people"це шлях
Андрій Боталов

Відповіді:


212

Цю відповідь я оновив, щоб відобразити сучасні умовності в капібарі. Я думаю, що це ідеально, оскільки це прийнята відповідь, і на що багато людей звертаються, шукаючи рішення. З урахуванням сказаного, правильний спосіб перевірити поточний шлях полягає у використанні has_current_path?Шукача наданий Капибара, як описано тут: Натисніть тут

Приклад використання:

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)

Подяку Тому Уолполу за вказівку на цей метод.


4
Напевно, мені дуже знадобиться цей синтаксис, я пишу тести для застарілої програми. Використання current_path.should ==працює на даний момент (хоча мені потрібно додати кінцеву косу косу рису як рядок). Я заздалегідь дякую вам за код, який, ймовірно, мені знадобиться.
Тасс

3
URI.parse(current_url).request_uriє більш лаконічним. Дивіться відповідь @Lasse Bunk.
Річард Джонс

Що стосується Capybara 2.5, це вже не найкраща відповідь. Дивіться відповідь @ tom-walpole нижче.
dkniffin

Оскільки запитувач навряд чи змінить прийняту відповідь, я оновив відповідь, щоб відобразити сучасність. Це має бути кориснішим новим користувачам, які шукають рішення та бачать першу відповідь. Дякуємо @OddityOverseer за вказівку на це
nzifnab

1
Для нових версій Capybara використовується ignore_query: trueзамістьonly_path: true
Олександр

92

Я замінив метод _path на _url, щоб досягти порівняння повних URL-адрес з параметрами.

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

4
Як ви поводилися з приймаючою частиною?
Кріс Нікола

11
Ви також можете використовувати current_pathв новіших версіях Capybara і порівнювати їх зpeople_path(...)
Джейсон Стірк

Коли я не назвав шлях ... у мене є лише / користувачі / зареєструватися ... то як мені це використовувати?
Gopal S Rathore

Що робити, якщо це відбувається на візуалізації, щоб URL-адреса відрізнялася від сторінки html?
bigpotato

52

Просто оновлення цього питання для сучасності. Поточна найкраща практика перевірки current_paths при використанні Capybara 2.5+ - це використання matcher current_path, який використовує поведінку очікування Capybaras для перевірки шляху. Якщо ви хочете перевірити наявність запиту_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

matcher візьме рядок, який порівнюється з == або з регулярним виразом для порівняння

expect(page).to have_current_path(/search=name/)

4
в ці сучасні часи це повинно бути позначено як в відповідь. Це дозволить уникнути безлічі розпливчастих питань, спасибі!
Сокира

1
@ Vanuan rspec знецінив shouldсинтаксис. Ви повинні прагнути використовувати expect().toу своїх специфікаціях, що рухаються вперед.
nzifnab

1
only_path: trueзаразignore_query: true
srghma

18

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

Щоб отримати шлях і рядок запитів, як 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

Сподіваюся, це допомагає.


1

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


Це не працює, якщо current_urlможе містити номер порту. Наприклад , з огляду на current_urlз http://foo.com:8888/some/path, current_url[current_host.size..-1]дорівнюватиме :8888/some/path. Крім того, за лаштунками current_hostдіє та сама URI.parseлогіка, яку @nzifnab рекомендував у прийнятій відповіді.
Tinynumbers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.