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?
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.
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')
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/)
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.
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