ruby on rails - Как да получите текущ път с низ за заявка с помощта на Capybara

Translate

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

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

Но не успява да каже

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

Как можем да го накараме да премине? Има ли някакъв начин да направите това?

This question and all comments follow the "Attribution Required."

Всички отговори

Translate

Актуализирах този отговор, за да отразява съвременните конвенции в capybara. Мисля, че това е идеално, тъй като това е приетият отговор и това, за което се говори много хора, когато търсят решение. С това казано, правилният начин да проверите текущия път е да използвате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)

Чест на Том Уолпъл за посочването на този метод.

източник
Translate

Замених метода _path с _url, за да постигна сравнение на пълните URL адреси с параметри.

current_url.should == people_url(:search => 'name')
източник
Translate

Просто актуализиране на този въпрос за съвременността. Настоящата най-добра практика за проверка на current_paths при използване на Capybara 2.5+ е използването на match_athath_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/)
източник
Translate

Знам, че е избран отговор, но просто исках да дам алтернативно решение. Така:

За да получите пътя и низа на заявки, като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

Надявам се това да помогне.

източник
Translate

РЕДАКТИРАНЕ: както споменахме Tinynumberes, това не успява за URL адреси с номер на порт. Пазете го тук, в случай че някой друг има същата блестяща идея.

current_url[current_host.size..-1]

голфове точно толкова (35 символа), колкотоURI.parse(current_url).request_uri, но е потенциално по-бърз, защото не е включено изрично разбор на URI.

Направих искане за изтегляне, за да добавя това към Capybara на адрес:https://github.com/jnicklas/capybara/pull/1405

източник