web-dev-qa-db-fra.com

Rails: Comment utiliser Capybara pour tester la valeur href d'un lien sans se soucier du texte?

Capybara fournit une méthode utile pour vérifier un lien:

have_link

qui pour autant que je sache, peut être utilisé comme:

have_link("link_text", :href => "actual link")

Cependant, je ne me soucie pas du link_text, je veux juste vérifier href (car la liaison du test au texte est plus fragile). Si je veux seulement vérifier le href ce serait un test de vue.

Comment utiliser Capybara pour vérifier le href sans avoir besoin de vérifier le texte? Peut-être que je peux utiliser regex?

[modifier] libellé modifié en fonction de la réponse ci-dessous

23
Drew Verlee

Capybara ne fournit pas de méthode link_to, donc je ne sais pas d'où vous obtenez cela (Rails fournit un link_to pour générer des liens dans la vue). Pour trouver un lien basé uniquement sur son href en utilisant capybara, vous pouvez le faire

link = page.find(:css, 'a[href="actual link"]')

ou si vous cherchez à affirmer que l'élément existe

page.assert_selector(:css, 'a[href="actual link"]')

ou - si vous utilisez RSpec

expect(page).to have_selector(:css, 'a[href="actual link"]')

Étant donné que le lien recherche par défaut les sous-chaînes dans le texte du lien, vous pouvez également le faire

expect(page).to have_link(nil, href: 'actual link')

ou

page.assert_selector(:link, nil, href: 'actual link')
43
Thomas Walpole

En regardant la même réponse, j'ai découvert qu'il était possible de passer des options au premier argument de have_link car son implémentation est:

# RSpec matcher for links
# See {Capybara::Node::Matchers#has_link?}
def have_link(locator=nil, options={}, &optional_filter_block)
  locator, options = nil, locator if locator.is_a? Hash
  HaveSelector.new(:link, locator, options, &optional_filter_block)
end

Donc, si vous ne vous souciez pas du texte du lien, vous pouvez en toute sécurité omettre le premier paramètre et le faire (syntaxe RSpec):

expect(page).to have_link(href: 'some url')
# or even
expect(page).to have_link(href: /some url regexp/)
7
Fabio