Jak uzyskać bieżącą ścieżkę z ciągiem zapytania przy użyciu Kapibary


144

Adres URL strony jest podobny, /people?search=name podczas gdy ja użyłem current_pathmetody kapibary, /peopletylko zwrócił .

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

Ale to się nie powiedzie

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

Jak możemy to przejść? Czy jest na to sposób?


10
"/people?search=name" nie jest ścieżką . "/people"jest ścieżką
— Andrei Botalov

Odpowiedzi:


212

Zaktualizowałem tę odpowiedź, aby odzwierciedlała współczesne konwencje w kapibarze. Myślę, że jest to idealne rozwiązanie, ponieważ jest to akceptowana odpowiedź i do której odnosi się wiele osób, szukając rozwiązania. Mając to na uwadze, właściwym sposobem sprawdzenia bieżącej ścieżki jest użycie has_current_path?dopasowania dostarczonego przez Kapibarę, zgodnie z dokumentacją tutaj: Kliknij tutaj

Przykładowe użycie:

expect(page).to have_current_path(people_path(search: 'name'))

Jak widać w dokumentacji, dostępne są inne opcje. Jeśli bieżąca strona jest, /people?search=nameale zależy Ci tylko na tym, że znajduje się na /peoplestronie niezależnie od parametru, możesz wysłać only_pathopcję:

expect(page).to have_current_path(people_path, only_path: true)

Dodatkowo, jeśli chcesz porównać cały adres URL:

expect(page).to have_current_path(people_url, url: true)

Podziękowania dla Toma Walpole'a za wskazanie tej metody.


4
Prawdopodobnie wkrótce będę potrzebować tej składni, piszę testy dla starszej aplikacji. Używanie current_path.should ==na razie działa (chociaż muszę dodać końcowy ukośnik jako ciąg). Z góry dziękuję za kod, którego prawdopodobnie będę potrzebować.
— Tass

3
URI.parse(current_url).request_urijest bardziej zwięzły. Zobacz odpowiedź @Lasse Bunk.
— Richard Jones

Od wersji Capybara 2.5 nie jest to już najlepsza odpowiedź. Zobacz odpowiedź @ tom-walpole poniżej.
— dkniffin

Ponieważ pytający raczej nie zmieni zaakceptowanej odpowiedzi, zaktualizowałem odpowiedź, aby odzwierciedlała współczesne czasy. Powinno to być bardziej pomocne dla nowych użytkowników szukających rozwiązania i widzących pierwszą odpowiedź. Dzięki @OddityOverseer za wskazanie tego
— nzifnab,

1
W przypadku nowych wersji Kapibary użyj ignore_query: truezamiastonly_path: true
— Alexander

92

Zastąpiłem metodę _path _url, aby uzyskać porównanie pełnych adresów URL z parametrami.

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

4
Jak poradziłeś sobie z częścią hosta?
— Chris Nicola,

11
Możesz także użyć current_pathw nowszych wersjach Kapibary i dopasować ją przeciwkopeople_path(...)
— Jason Stirk

Kiedy nie mam nazwanej ścieżki ... mam tylko / users / register ... to jak mam z niej korzystać?
— Gopal S Rathore

A co, jeśli dzieje się to podczas renderowania, tak że adres URL różni się od strony html?
— bigpotato

52

Aktualizuję to pytanie do czasów współczesnych. Bieżącą najlepszą praktyką sprawdzania bieżących ścieżek podczas korzystania z Kapibary 2.5+ jest użycie dopasowania bieżącej_ścieżki, który użyje zachowania czekającego Capybaras do sprawdzenia ścieżki. Jeśli chcesz porównać request_uri (ścieżka i ciąg zapytania)

expect(page).to have_current_path(people_path(:search => 'name'))  

Jeśli chcesz tylko część ścieżki (ignorowanie ciągu zapytania)

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

Jeśli chcesz dopasować pełny adres 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

element dopasowujący weźmie łańcuch, który jest porównywany z == lub wyrażeniem regularnym do dopasowania

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

4
w tych czasach nowożytnych powinno być oznaczone jako na odpowiedź. Pozwoli to uniknąć wielu niejasnych problemów z synchronizacją, dzięki!
— Axe

1
@Vanuan rspec wycofuje shouldskładnię. Powinieneś starać się używać expect().tow swoich specyfikacjach w przyszłości.
— nzifnab

1
only_path: truejest terazignore_query: true
— srghma

18

Wiem, że wybrano odpowiedź, ale chciałem tylko podać alternatywne rozwiązanie. Więc:

Aby uzyskać ścieżkę i querystring, jak request.fullpathw Railsach, możesz:

URI.parse(current_url).request_uri.should == people_path(:search => 'name')

Możesz również wykonać metodę pomocniczą w swojej klasie testowej (na przykład ActionDispatch::IntegrationTest) w następujący sposób (co zrobiłem):

def current_fullpath
  URI.parse(current_url).request_uri
end

Mam nadzieję że to pomoże.


1

EDYCJA: jak wspomniał Tinynumberes, nie udaje się to w przypadku adresów URL z numerem portu. Zachowaj to tutaj na wypadek, gdyby ktoś inny wpadł na ten sam genialny pomysł.

current_url[current_host.size..-1]

golfa dokładnie tak samo (35 znaków) jak URI.parse(current_url).request_uri, ale jest potencjalnie szybsze, ponieważ nie obejmuje jawnego analizowania identyfikatora URI.

Poprosiłem o dodanie tego do Kapibary pod adresem : https://github.com/jnicklas/capybara/pull/1405


To nie działa, jeśli current_urlmoże zawierać numer portu. Np. Biorąc current_urlpod uwagę http://foo.com:8888/some/path, current_url[current_host.size..-1]będzie równe :8888/some/path. Poza tym za kulisami current_hostdziała ta sama URI.parselogika, którą @nzifnab zalecał w zaakceptowanej odpowiedzi.
— Tinynumbers
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.