Je sais qu'à Capybara, vous pouvez faire quelque chose comme ceci:
page.should have_css("ol li", :count => 2)
Cependant, en supposant que cette page n'a par exemple qu'un seul élément correspondant, l'erreur n'est pas très descriptive:
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 ce message d'erreur plutôt obscur, existe-t-il un moyen d'écrire l'assertion de telle sorte que la sortie d'erreur soit quelque chose comme «Lors de la mise en correspondance de« ol li », attendu: 2, trouvé: 1». De toute évidence, je pourrais créer moi-même une logique personnalisée pour un tel comportement - je demande s'il existe un moyen de le faire «hors de la boîte»?
Pour ce que ça vaut, j'utilise le pilote Selenium et RSpec.
page.should have_css("ol li", :count => 2)
n'aurait pas déjà été implémenté.Réponses:
J'aime beaucoup mieux ça.
expect(page).to have_selector('input', count: 12)
https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb
la source
have_css
:expect(page).to have_css('input', count: 12)
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 obtenez 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
Cela fait l'affaire pour l'instant, je vais chercher à faire cette partie de Capybara.
la source
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 s'imprime ensuite en cas d'erreur:
expected: 2 got: 3 (compared using eql?) (RSpec::Expectations::ExpectationNotMetError)
la source
Edit: Comme indiqué par @ThomasWalpole, l'utilisation de
all
désactive l'attente / réessayer de Capybara, donc la réponse ci-dessus par @pandaPower est bien meilleure.Que dis-tu de ça?
within('ol') do expect( all('.opportunity_title_wrap').count ).to eq(2) end
la source
within
, il appelle.count
les résultatsall
qui désactive l'attente / réessayer. En appelantcount
les résultats deall
(pour lesquels un "tableau" vide est un retour valide) vous convertissez en un entier et comparez-le. Si cette comparaison échoue, l'attente échoue. Si à la place vous passez l'option count à l'un des correspondants de Capybara, capybara attendra / réessayera de trouver le sélecteur spécifié jusqu'à ce que l'option count corresponde (ou Capybara.default_max_wait_time expire).La meilleure pratique actuelle (02/09/2013) recommandée par Capybara est la suivante ( source ):
page.assert_selector('p#foo', :count => 4)
la source
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)
la source