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