it-swarm.com.de

Wie kann man mit Capybara die Anzahl der Elemente mit der richtigen Fehlermeldung bestätigen?

Ich weiß, dass Sie in Capybara so etwas tun können:

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

Unter der Annahme, dass die Seite beispielsweise nur ein übereinstimmendes Element enthält, ist der Fehler jedoch nicht sehr aussagekräftig:

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

Anstelle dieser eher undurchsichtigen Fehlermeldung kann die Behauptung so geschrieben werden, dass die Fehlerausgabe etwa wie folgt lautet: 'Bei Übereinstimmung mit' ol li ', erwartet: 2, gefunden: 1'. Natürlich könnte ich selbst eine benutzerdefinierte Logik für ein solches Verhalten erstellen - ich frage mich, gibt es eine Möglichkeit, dies "out of the box" zu tun?

Für das, was es wert ist, verwende ich Selenium-Treiber und RSpec.

80
merryprankster

Das gefällt mir viel besser.

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

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

169
pandaPowder

Nun, wie es scheint, gibt es keinen sofort einsatzbereiten Support. Ich habe diesen benutzerdefinierten Matcher geschrieben:

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

Jetzt können Sie folgende Aufgaben ausführen:

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

und bekomme eine Ausgabe wie:

  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

Es macht den Trick fürs Erste, ich werde versuchen, diesen Teil von Capybara zu machen.

22
merryprankster

Ich denke, dass das Folgende einfacher ist, eine ziemlich klare Ausgabe liefert und die Notwendigkeit eines benutzerdefinierten Matchers beseitigt.

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

Dies druckt dann auf Fehler aus:

      expected: 2
       got: 3

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

Edit: Wie von @ThomasWalpole hervorgehoben, deaktiviert die Verwendung von all das Warten/Wiederholen von Capybara, daher ist die obige Antwort von @pandaPower viel besser.

Wie wäre es damit?

  within('ol') do
    expect( all('.opportunity_title_wrap').count ).to eq(2)
  end
9

Die von Capybara empfohlene aktuelle (9/2/2013) Best Practice ist die folgende ( Quelle ):

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

3
acconrad