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