Die Seiten-URL ist so etwas wie, /people?search=name
während ich die current_path
Capybara-Methode verwendet habe , die /people
nur zurückgegeben wurde.
current_path.should == people_path(:search => 'name')
Aber es sagt nicht
expected: "/people?search=name"
got: "/people"
Wie können wir es schaffen? Gibt es eine Möglichkeit, dies zu tun?
ruby-on-rails
ruby-on-rails-3
rspec
capybara
Kriysna
quelle
quelle
"/people?search=name"
ist kein Weg ."/people"
ist ein WegAntworten:
Ich habe diese Antwort aktualisiert, um moderne Konventionen in Capybara widerzuspiegeln. Ich denke, dies ist ideal, da dies die akzeptierte Antwort ist und auf was viele Menschen bei der Suche nach einer Lösung verwiesen werden. Der korrekte Weg, um den aktuellen Pfad zu überprüfen, besteht darin, den
has_current_path?
von Capybara bereitgestellten Matcher zu verwenden , wie hier dokumentiert: Klicken Sie hierAnwendungsbeispiel:
Wie Sie in der Dokumentation sehen können, stehen andere Optionen zur Verfügung. Wenn sich die aktuelle Seite befindet
/people?search=name
, Sie sich jedoch nur darum kümmern, dass sie sich/people
unabhängig vom Parameter auf der Seite befindet, können Sie die folgendeonly_path
Option senden :Wenn Sie außerdem die gesamte URL vergleichen möchten:
Dank an Tom Walpole für den Hinweis auf diese Methode.
quelle
current_path.should ==
funktioniert vorerst (obwohl ich einen abschließenden Schrägstrich als Zeichenfolge hinzufügen muss). Ich danke Ihnen im Voraus für den Code, den ich wahrscheinlich brauche.URI.parse(current_url).request_uri
ist prägnanter. Siehe die Antwort von @Lasse Bunk.ignore_query: true
anstelle vononly_path: true
Ich habe die _path-Methode durch _url ersetzt, um die vollständigen URLs mit den Parametern zu vergleichen.
quelle
current_path
in neueren Versionen von Capybara verwenden und es gegenpeople_path(...)
Nur diese Frage für die moderne Zeit aktualisieren. Die derzeitige bewährte Methode zum Überprüfen von current_paths bei Verwendung von Capybara 2.5+ ist die Verwendung des current_path-Matchers, der das Warteverhalten von Capybaras zum Überprüfen des Pfads verwendet. Wenn Sie gegen die request_uri (Pfad und Abfragezeichenfolge) prüfen möchten
Wenn nur der Pfadteil gewünscht wird (Ignorieren der Abfragezeichenfolge)
Wenn Sie mit der vollständigen URL übereinstimmen möchten
Der Matcher nimmt eine Zeichenfolge, die mit == verglichen wird, oder einen regulären Ausdruck, mit dem verglichen werden soll
quelle
should
Syntax abgelehnt . Sie sollten sich bemühen,expect().to
in Zukunft in Ihren Spezifikationen zu verwenden.only_path: true
ist jetztignore_query: true
Ich weiß, dass eine Antwort ausgewählt wurde, aber ich wollte nur eine alternative Lösung geben. So:
Um den Pfad und den Querystring wie
request.fullpath
in Rails abzurufen, können Sie Folgendes tun:Sie können auch eine Hilfsmethode in Ihrer Testklasse (wie diese
ActionDispatch::IntegrationTest
) ausführen (wie ich es getan habe):Hoffe das hilft.
quelle
BEARBEITEN: Wie von Tinynumberes erwähnt, schlägt dies bei URLs mit Portnummer fehl. Bewahren Sie es hier auf, falls jemand anderes die gleiche brillante Idee hat.
Golf genau so gut (35 Zeichen) wie
URI.parse(current_url).request_uri
, ist aber möglicherweise schneller, da keine explizite URI-Analyse erforderlich ist.Ich habe eine Pull-Anfrage gestellt, um dies zu Capybara hinzuzufügen: https://github.com/jnicklas/capybara/pull/1405
quelle
current_url
möglicherweise eine Portnummer enthält. ZB gegeben eincurrent_url
vonhttp://foo.com:8888/some/path
,current_url[current_host.size..-1]
wird gleich:8888/some/path
. Hinter den Kulissencurrent_host
wird dieselbeURI.parse
Logik verwendet, die @nzifnab in der akzeptierten Antwort empfohlen hat.