Comment tester si un div a un certain style css dans rspec/capybara?

Comment tester si une balise div a un certain style css? J'essaie de tester s'il a display:none; ou display:block.

J'ai essayé ce qui suit mais cela me donne une erreur:

it {should have_selector('signup_server_generic_errors', /display:s*none/)}
24
demandé sur Nakilon 2012-06-26 03:31:29

3 réponses

Je recommande qu'au lieu d'essayer de localiser le style css, vous écrivez plutôt vos tests pour trouver le nom de classe CSS.

De cette façon, vous pouvez changer le style CSS sous-jacent tout en gardant la classe la même et vos tests réussiront toujours.

La recherche du style sous-jacent est fragile. Les Styles changent fréquemment. Fonder vos rspecs sur la recherche d'éléments de style spécifiques rend vos tests plus fragiles - ils seront plus susceptibles d'échouer quand tout ce que vous faites est de changer un div regarder et se sentir.

Fonder vos tests sur la recherche de classes css rend les tests plus robustes. Cela leur permet de s'assurer que votre code fonctionne correctement tout en ne vous obligeant pas à les modifier lorsque vous changez de style de page.

Dans ce cas spécifiquement, une option peut être de définir une classe CSS nommée .hidden qui définit display:none; sur un élément pour le masquer.

Comme ceci:

Css:

.hidden {
  display:none;
}

Html:

<div class="hidden">HIDE ME!</div>

Capybara:

it {should have_css('div.hidden') }

Ce capybara cherche juste un div cela a la classe hidden - vous pouvez rendre ce matcher plus sophistiqué si vous en avez besoin.

Mais le point principal est le suivant: attachez des styles aux noms de classes css, puis attachez vos tests aux classes, pas aux styles.

38
répondu Kevin Bedell 2012-06-29 04:11:50

Vous pouvez utiliser has_css? matcher. Il peut accepter les options :visible. Pour plus de détails, vous pouvez consulter docs: http://rdoc.info/github/jnicklas/capybara/Capybara/Node/Matchers#has_css%3F-instance_method

, Par exemple, vous pouvez essayer:

it { should have_css('div.with-some-class', :visible => true) }

12
répondu luacassus 2012-07-02 07:03:04

Ma façon de m'assurer que cet élément a une certaine classe:

let(:action_items) { page.find('div.action_items') }

it "action items displayed as buttons" do
  action_items.all(:css, 'a').each do |ai|
    expect(ai[:class]).to match(/btn/)
  end
end

Ou smthing comme ceci

expect(ai[:style]).to match(/color: red/)

Je l'ai trouvé ici: http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Element#%5B%5D-instance_method

7
répondu 18augst 2014-06-24 12:57:29