Come ottenere il percorso corrente con la stringa di query utilizzando Capybara


144

L'URL della pagina è qualcosa di simile /people?search=name mentre mentre current_pathusavo il metodo del capibara è tornato /peoplesolo.

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

Ma non riesce a dire

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

Come possiamo farcela passare? C'è un modo per farlo?


10
"/people?search=name" non è un percorso . "/people"è un percorso
Andrei Botalov,

Risposte:


212

Ho aggiornato questa risposta per riflettere le convenzioni moderne in capibara. Penso che sia l'ideale in quanto questa è la risposta accettata e ciò a cui molte persone vengono indicate quando cercano una soluzione. Detto questo, il modo corretto di verificare il percorso corrente è utilizzare il has_current_path?matcher fornito da Capybara, come documentato qui: Fai clic qui

Esempio di utilizzo:

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

Come puoi vedere nella documentazione, sono disponibili altre opzioni. Se la pagina corrente è, /people?search=namema ti interessa solo che sia sulla /peoplepagina indipendentemente dal parametro, puoi inviare l' only_pathopzione:

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

Inoltre, se si desidera confrontare l'intero URL:

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

Ringraziamo Tom Walpole per aver sottolineato questo metodo.


4
Probabilmente avrò bisogno di questa sintassi molto presto, sto scrivendo test per un'applicazione legacy. Usare current_path.should ==per ora funziona (anche se ho bisogno di aggiungere una barra rovesciata come stringa). Ti ringrazio anticipatamente per il codice che probabilmente mi servirà.
Tass

3
URI.parse(current_url).request_uriè più succinto. Vedi la risposta di @Lasse Bunk.
Richard Jones,

A partire da Capybara 2.5, questa non è più la risposta migliore. Vedi la risposta di @ tom-walpole qui sotto.
dkniffin,

Dal momento che è improbabile che il richiedente cambi la risposta accettata, ho aggiornato la risposta per riflettere i tempi moderni. Questo dovrebbe essere più utile per i nuovi utenti che cercano una soluzione e vedono la prima risposta. Grazie @OddityOverseer per averlo segnalato
nzifnab

1
Per le nuove versioni di Capybara utilizzare ignore_query: trueinvece dionly_path: true
Alexander

92

Ho sostituito il metodo _path con _url per ottenere il confronto degli URL completi con i parametri.

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

4
Come hai gestito la parte host?
Chris Nicola,

11
Puoi anche usarlo current_pathnelle nuove versioni di Capybara e abbinarlo contropeople_path(...)
Jason Stirk il

Quando non ho un percorso con nome ... Ho solo / utenti / registrati ... allora come dovrei usarlo?
Gopal S Rathore

Cosa succede se sta accadendo su un rendering, in modo che l'URL sia diverso dalla pagina HTML?
bigpotato,

52

Sto solo aggiornando questa domanda per i tempi moderni. La migliore pratica corrente per controllare current_paths quando si usa Capybara 2.5+ è usare il matcher current_path, che utilizzerà il comportamento in attesa di Capybaras per controllare il percorso. Se si desidera verificare con request_uri (percorso e stringa di query)

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

Se si desidera solo la parte del percorso (ignorando la stringa di query)

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

Se si desidera abbinare l'URL completo

expect(page).to have_current_path(people_url, url: true) # Capybara < 2.16
expect(page).to have_current_path(people_url) # Capybara >= 2.16

il matcher prenderà una stringa che viene confrontata con == o una regex con cui confrontarla

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

4
in questi tempi moderni questo dovrebbe essere contrassegnato come la risposta. Questo salverà molti vaghi problemi di tempistica, grazie!
Ascia

1
@Vanuan rspec ha deprecato la shouldsintassi. Dovresti cercare di utilizzare le expect().totue specifiche in futuro.
nzifnab,

1
only_path: trueè oraignore_query: true
srghma,

18

So che è stata selezionata una risposta, ma volevo solo dare una soluzione alternativa. Così:

Per ottenere il percorso e la stringa di query, come request.fullpath in Rails, puoi fare:

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

Puoi anche fare un metodo helper nella tua classe di test (come ActionDispatch::IntegrationTest ) come questo (che è quello che ho fatto):

def current_fullpath
  URI.parse(current_url).request_uri
end

Spero che questo ti aiuti.


1

EDIT: come menzionato Tinynumberes, questo non riesce per gli URL con numero di porta. Tienilo qui nel caso in cui qualcun altro abbia la stessa brillante idea.

current_url[current_host.size..-1]

golf esattamente altrettanto (35 caratteri) URI.parse(current_url).request_uri, ma è potenzialmente più veloce perché non è coinvolto un analisi URI esplicita.

Ho fatto una richiesta pull per aggiungere questo a Capybara su: https://github.com/jnicklas/capybara/pull/1405


Questo non funziona se current_urlpotrebbe contenere un numero di porta. Ad esempio, dato un current_urldi http://foo.com:8888/some/path, current_url[current_host.size..-1]sarà uguale :8888/some/path. Inoltre, dietro le quinte current_hostfa lo stesso tipo di URI.parselogica che @nzifnab ha raccomandato nella risposta accettata.
Tinynumbers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.