web-dev-qa-db-fra.com

Est-il possible de tester l'ordre des éléments via RSpec/Capybara?

J'utilise RSpec/Capybara comme suite de tests. J'ai du javascript qui ajoute dynamiquement <li> à la fin d'un <ul>. Je veux écrire une spécification de demande pour m'assurer que cela se produit.

J'ai essayé d'utiliser la méthode has_css Capybara et des sélecteurs CSS avancés pour tester l'ordre des éléments <li>, mais Capybara ne prend pas en charge le sélecteur CSS +.

Exemple:

page.should have_css('li:contains("ITEM #1")')
pseuo_add_new_li
page.should have_css('li:contains("ITEM #1")+li:contains("ITEM #2")')

Est-ce que quelqu'un connaît un autre moyen de tester la commande?

39
John

J'ai résolu ce problème en testant une correspondance d'expression régulière avec le contenu du corps de la page. Un peu kludgy, mais ça marche.

page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
33
John

J'ai trouvé un moyen plus canonique de tester ce comportement avec CSS. Vous pouvez utiliser les sélecteurs :first-child, :last-child et :nth-child(n) dans le choix de votre choix. 

Dans votre exemple, j'essaierais ces assertions: 

page.should have_tag("ul:last-child", :text => "ITEM #1")
pseuo_add_new_li
page.should have_tag("ul:nth-last-child(2)", :text => "ITEM #1")
page.should have_tag("ul:last-child", :text => "ITEM #2")

J'espère que ça aidera quelqu'un. En savoir plus à ce sujet .

29
dgilperez

cet article répertorie plusieurs façons de tester l'ordre de tri dans RSpec, ce qui semble être la meilleure option:

RSpec::Matchers.define :appear_before do |later_content|
  match do |earlier_content|
    page.body.index(earlier_content) < page.body.index(later_content)
  end
end
26
Finn MacCool

J'ai eu le même problème récemment et j'ai trouvé cette solution soignée et idéale: http://launchware.com/articles/acceptance-testing-asserting-sort-order

C'est même emballé comme un petit bijou. 

3
TomTaila

Cette page a un moyen très astucieux de tester l'ordre des éléments de chaîne sur une page - qu'ils soient dans une liste ou non:

https://makandracards.com/makandra/789-match-strings-in-a-given-order-with-cucumber-and-capybara

Il se présente sous la forme d'une étape concombre, mais vous devriez pouvoir extraire ce dont vous avez besoin pour une étape Rspec. C'est similaire à la solution "kludgy" de Johns - mais un peu plus sophistiqué à mon avis. Toutes leurs autres étapes de tests de ruse capybara peuvent être trouvés ici:

https://github.com/makandra/spreewald

2
charlesdeb

Vous pouvez utiliser la méthode all Finder pour sélectionner plusieurs éléments, puis utiliser collect pour extraire le texte dans un tableau:

assert_equal page.all('#navigation ul li').collect(&:text), ['Item 1', 'Item 2', 'Item 3']

Si votre liste n'est pas visible sur la page, par exemple un menu de navigation contextuel, vous devez passer visible: false à la méthode all.

2
Jay P.

Utilisez la orderlygem , écrite par l’auteur du article mentionné précédemment.

C'est aussi simple que:

expect(this).to appear_before(that)
1
Jan Klimo

Dans les solutions ci-dessus, il était très difficile de tester l'ordre si plusieurs éléments étaient présents sur la page. J'ai donc trouvé un autre moyen.

J'ai posté la solution ici - Ordre de test (séquence) du contenu à l'aide de capybara

Mappage des tableaux contenant des éléments css spécifiques, puis correspondance de ce tableau avec le tableau attendu (conserver les éléments dans l'ordre)

0
Rhunal

En utilisant capybara-ui , vous pouvez utiliser la méthode #widgets pour obtenir tous les éléments par ordre décroissant.

# First define the widget,
# or reusable dom element reference.
# In this case in a role
class UserRole < Capybara::UI::Role
  widget :list_item, '.list-item'
end

# Then test the expected order using #widgets
role = UserRole.new
expected_order = ['buy milk', 'get gas', 'call dad']
actual_order = role.widgets(:list_item).map(&:text)

expect(actual_order).to eq(expected_order)
0
steel

Capybara devrait supporter le sélecteur + (je crois qu’il utilise Nokogiri, qui le supporte certainement). Utilisez-vous peut-être une ancienne version? Ou utilisez-vous un pilote Capybara qui ne prend pas en charge JavaScript, de sorte que l'élément supplémentaire ne soit pas rendu du tout?

De même, n'utilisez pas RSpec pour tester votre code HTML. Le concombre est bien meilleur à cela. Pour interagir avec JavaScript, vous voudrez utiliser Selenium ou Capybara-Webkit. Ou si vous avez beaucoup de JavaScript, envisagez de le tester avec Jasmine.

0