Wie schreibe ich eine Capybara-Behauptung, die prüft, ob eine Schaltfläche vorhanden ist und ob sie aktiviert oder deaktiviert ist?

Ich habe eine App, die Schaltflächen als Reaktion auf Ereignisse in der Benutzeroberfläche aktiviert / deaktiviert.

Ich kann Capybara einfach verwenden, um festzustellen, ob eine Schaltfläche vorhanden ist

should have_button 'save'

Ich habe jedoch keine Ahnung, wie der Status der Schaltfläche "Speichern" überprüft werden soll. Das ist:

Wie schreibe ich eine Capybara-Behauptung, die das Vorhandensein einer Schaltfläche überprüftund seinen aktivierten oder deaktivierten Zustand?

Ich habe einen Check für einen deaktivierten Button gehackt. Ich nehme an, dass ich für enabled überprüfen konnte, ob es eine passende Schaltfläche gibt und keine passende deaktivierte Schaltfläche. Aber das ist, gelinde gesagt, klobig.

Dies scheint eine so grundlegende Überprüfung der Benutzeroberfläche zu sein, dass ich mir sicher bin, dass ich etwas verpasst habe, aber ich kann nicht herausfinden, was.

Follow-up basierend auf der Antwort von gregates:

Wie ich in dem Kommentar erwähnte, hängt das Verhalten von Capybara von dem zugrunde liegenden Treiber ab. Wir verwenden ein Webkit, das "true" / "false" -Stringergebnisse zurückgibt. Anscheinend geben andere Treiber true / false zurück. Die Leute bei Capybara sind sich des Problems bewusst (github.com/jnicklas/capybara/issues/705), aber sie glauben (wahrscheinlich richtig), dass es nicht wirklich ihr Problem ist, das sie lösen müssen.

Anstatt dass meine Tests vom verwendeten Treiber abhängen, habe ich einen benutzerdefinierten Matcher erstellt:

RSpec::Matchers.define :be_enabled do
  match do |actual|
    driver_result = actual[:disabled]
    # nil, false, or "false" will all satisfy this matcher
    (driver_result.nil? || driver_result == false || driver_result == "false").should be_true
  end
end

RSpec::Matchers.define :be_disabled do
  match do |actual|
    driver_result = actual[:disabled]
    (driver_result == "disabled" || driver_result == true || driver_result == "true").should be_true
  end
end

Dann können Sie Folgendes eingeben:

user_license_area.find_button('Save').should be_disabled

Antworten auf die Frage(5)

Ihre Antwort auf die Frage