web-dev-qa-db-fra.com

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

L'URL de la page ressemble à quelque chose comme /people?search=name Alors que j'utilisais la méthode current_path De capybara, elle retournait seulement /people.

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

Mais ça ne dit rien

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

Comment pouvons-nous le faire passer? Y at-il un moyen de faire cela?

138
kriysna

J'ai mis à jour cette réponse pour refléter les conventions modernes à capybara. Je pense que c’est l’idéal car c’est la réponse acceptée et ce à quoi beaucoup de gens se réfèrent lorsqu'ils cherchent 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, 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 vous vous souciez seulement que ce soit sur le /people page quel que soit le paramètre, vous pouvez envoyer le only_path option:

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 signalé cette méthode.

204
nzifnab

J'ai remplacé la méthode _path par _url pour comparer les URL complètes à des paramètres.

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

Il suffit de mettre à jour cette question pour les temps modernes. La meilleure pratique actuelle pour vérifier current_paths lors de l’utilisation de Capybara 2.5+ consiste à utiliser le matcher current_path, qui utilisera le comportement d’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 est comparée avec == ou un regex pour correspondre à

expect(page).to have_current_path(/search=name/)
49
Thomas Walpole

Je sais qu'une réponse a été choisie, 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 faire:

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

Vous pouvez également utiliser une méthode d’aide dans votre classe de test (comme ActionDispatch::IntegrationTest) comme ça (c'est ce que j'ai fait):

def current_fullpath
  URI.parse(current_url).request_uri
end

J'espère que cela t'aides.

17
Lasse Bunk

EDIT: comme mentionné par Tinynumberes, cela échoue pour les URL avec le numéro de port. Gardez-le ici au cas où quelqu'un d'autre aurait la même idée brillante.

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 aucune analyse d’URI explicite n’est impliquée.

J'ai fait une demande d'extraction pour l'ajouter à Capybara à l'adresse suivante: https://github.com/jnicklas/capybara/pull/1405