Adres URL strony jest podobny, /people?search=name
podczas gdy ja użyłem current_path
metody kapibary, /people
tylko 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?
ruby-on-rails
ruby-on-rails-3
rspec
capybara
kriysna
źródło
źródło
"/people?search=name"
nie jest ścieżką ."/people"
jest ścieżkąOdpowiedzi:
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 tutajPrzykładowe użycie:
Jak widać w dokumentacji, dostępne są inne opcje. Jeśli bieżąca strona jest,
/people?search=name
ale zależy Ci tylko na tym, że znajduje się na/people
stronie niezależnie od parametru, możesz wysłaćonly_path
opcję:Dodatkowo, jeśli chcesz porównać cały adres URL:
Podziękowania dla Toma Walpole'a za wskazanie tej metody.
źródło
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ć.URI.parse(current_url).request_uri
jest bardziej zwięzły. Zobacz odpowiedź @Lasse Bunk.ignore_query: true
zamiastonly_path: true
Zastąpiłem metodę _path _url, aby uzyskać porównanie pełnych adresów URL z parametrami.
źródło
current_path
w nowszych wersjach Kapibary i dopasować ją przeciwkopeople_path(...)
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)
Jeśli chcesz tylko część ścieżki (ignorowanie ciągu zapytania)
Jeśli chcesz dopasować pełny adres URL
element dopasowujący weźmie łańcuch, który jest porównywany z == lub wyrażeniem regularnym do dopasowania
źródło
should
składnię. Powinieneś starać się używaćexpect().to
w swoich specyfikacjach w przyszłości.only_path: true
jest terazignore_query: true
Wiem, że wybrano odpowiedź, ale chciałem tylko podać alternatywne rozwiązanie. Więc:
Aby uzyskać ścieżkę i querystring, jak
request.fullpath
w Railsach, możesz: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):Mam nadzieję że to pomoże.
źródło
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ł.
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
źródło
current_url
może zawierać numer portu. Np. Biorąccurrent_url
pod uwagęhttp://foo.com:8888/some/path
,current_url[current_host.size..-1]
będzie równe:8888/some/path
. Poza tym za kulisamicurrent_host
działa ta samaURI.parse
logika, którą @nzifnab zalecał w zaakceptowanej odpowiedzi.