93 votes

Comment affirmer le nombre d'éléments en utilisant Capybara avec le message d'erreur approprié?

Je sais que dans le Capybara, vous pouvez faire quelque chose comme ceci:

page.should have_css("ol li", :count => 2)

Cependant, en supposant que la page a par exemple un seul élément correspondant, l'erreur n'est pas très descriptif:

  1) initial page load shows greetings
 Failure/Error: page.should have_css("ol li", :count => 2)
 expected css "ol li" to return something

Au lieu de cela plutôt obscurs de message d'erreur, il est un moyen d'écrire l'affirmation d'une telle façon que la sortie d'erreur serait quelque chose comme " Quand correspondant à 'ol li", prévu: 2,: 1'. Évidemment, je pourrais faire une logique personnalisée moi-même pour un tel comportement, je me demande est-il une façon de faire "hors de la boîte"?

Pour ce que ça vaut, je suis en utilisant le Sélénium pilote et RSpec.

189voto

pandaPowder Points 575

J'aime beaucoup mieux ça.

 expect(page).to have_selector('input', count: 12)
 

https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3f0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb

22voto

merryprankster Points 1397

Eh bien, comme il semble qu'il n'y ait pas de support prêt à l'emploi, j'ai écrit ce matcher personnalisé:

 RSpec::Matchers.define :match_exactly do |expected_match_count, selector|
    match do |context|
        matching = context.all(selector)
        @matched = matching.size
        @matched == expected_match_count
    end

    failure_message_for_should do
        "expected '#{selector}' to match exactly #{expected_match_count} elements, but matched #{@matched}"
    end

    failure_message_for_should_not do
        "expected '#{selector}' to NOT match exactly #{expected_match_count} elements, but it did"
    end
end
 

Maintenant, vous pouvez faire des choses comme:

 describe "initial page load", :type => :request do
    it "has 12 inputs" do
        visit "/"
        page.should match_exactly(12, "input")
    end
end
 

et obtenir une sortie comme:

   1) initial page load has 12 inputs
     Failure/Error: page.should match_exactly(12, "input")
       expected 'input' to match exactly 12 elements, but matched 13
 

Pour le moment, je vais essayer de faire cette partie de Capybara.

15voto

Richard Points 697

Je pense que ce qui suit est plus simple, donne une sortie assez claire et élimine le besoin d'un matcher personnalisé.

 page.all("ol li").count.should eql(2)
 

Cela imprime ensuite en erreur:

       expected: 2
       got: 3

  (compared using eql?)
  (RSpec::Expectations::ExpectationNotMetError)
 

5voto

acconrad Points 1907

La meilleure pratique actuelle (9/2/2013) recommandée par Capybara est la suivante ( source ):

page.assert_selector('p#foo', :count => 4)

-5voto

Nick Points 524

La réponse de @pandaPower est très bonne, mais la syntaxe était légèrement différente pour moi:

 expect(page).to have_selector('.views-row', :count => 30)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X