Comment obtenir le chemin actuel avec la chaîne de requête en utilisant Capybara

L’URL de la page est quelque chose comme /people?search=name alors que j’utilisais la méthode current_path de capybara, elle ne renvoyait que /people .

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

Mais cela échoue en disant

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

Comment pouvons-nous le faire passer? Est-il possible de faire cela?

J’ai mis à jour cette réponse pour refléter les conventions modernes en capybara. Je pense que cela est idéal car il s’agit de la réponse acceptée, et de ce à quoi de nombreuses personnes font référence lorsqu’elles recherchent une solution. Cela dit, la bonne façon de vérifier le chemin actuel est d’utiliser le has_current_path? matcher fourni par Capybara, tel que documenté ici: Cliquez ici

Exemple d’utilisation:

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

Comme vous pouvez le voir dans la documentation, d’autres options sont disponibles. Si la page en cours est /people?search=name mais que vous ne vous souciez que de la page /people quel que soit le paramètre, vous pouvez envoyer l’option only_path :

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

De plus, si vous souhaitez comparer l’URL complète:

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

Nous remercions Tom Walpole d’avoir souligné cette méthode.

J’ai remplacé la méthode _path par _url pour comparer les URL complètes avec les parameters.

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

Il suffit de mettre à jour cette question pour les temps modernes. La meilleure pratique actuelle pour vérifier les chemins_continent lorsque vous utilisez Capybara 2.5+ consiste à utiliser le gestionnaire de chemin actuel, qui utilisera le comportement en attente de Capybaras pour vérifier le chemin. Si vous voulez vérifier avec request_uri (chemin et chaîne de requête)

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

Si vous ne voulez que la partie chemin (en ignorant la chaîne de requête)

 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 

Si vous voulez faire correspondre l’URL complète

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

le matcher prendra une chaîne qui sera comparée avec == ou une regex pour correspondre

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

Je sais qu’une réponse a été sélectionnée, mais je voulais juste donner une solution alternative. Alors:

Pour obtenir le chemin et la chaîne de requête, comme request.fullpath dans Rails, vous pouvez:

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

Vous pouvez également faire une méthode d’assistance dans votre classe de test (comme ActionDispatch::IntegrationTest ) comme ceci (ce que j’ai fait):

 def current_fullpath URI.parse(current_url).request_uri end 

J’espère que cela t’aides.

EDIT: comme mentionné Tinynumberes, cela échoue pour les URL avec le numéro de port. Le garder ici au cas où quelqu’un d’autre aurait la même idée géniale.

 current_url[current_host.size..-1] 

golfs exactement aussi bien (35 caractères) que URI.parse(current_url).request_uri , mais est potentiellement plus rapide car il n’y a pas d’parsing explicite d’URI impliquée.

J’ai fait une demande de tirage pour append ceci à Capybara à: https://github.com/jnicklas/capybara/pull/1405