2014-03-12 8 views
5

Mit Rails, rspec und Capybara klicken, ich versuche, Ihre typische ERB erzeugte Form zu testen:Wie die Form begehen Schaltfläche in Capybara

<form action="/pages/1" id="edit_page_1" method="post"> 
    <input id="page_title" name="page[title]" type="text"> 
    <input name="commit" type="submit" value="Update Page"> 
</form> 

ich zwei Arten von Feature-Spezifikationen laufen, jene, die das sind egal welche Sprache und welche I18N spezifisch sind (für Internationalisierungstests).

Das Problem ist, gibt es keine klare Möglichkeit, klicken Sie auf diese Schaltfläche mit Capybara absenden, es sei denn, ich vermisse das Offensichtliche. Ich würde einfach click('commit') erwarten, um den Trick zu tun.

  • Mit click_button('Update Page') funktioniert, ist aber offensichtlich sprachspezifisch und kann nicht mit den neuen und bearbeiten Vorlagen verwendet werden, obwohl sie die gleiche Formularvorlage machen.
  • Das Hinzufügen einer ID zum Submit-Button funktioniert, aber ich möchte den Code nicht ausschließlich ändern, weil der Test dies erfordert.
  • Mit einem CSS-oder XML-Matcher sehen beide hässlich aus (ein Benutzer würde nie wissen/kümmern sich um den Zugriff auf ein Element auf diese Weise) und es ist übertrieben.

Antwort

12

Am Ende war ein Makro die Antwort, die ich brauchte, da anscheinend nichts in Capybara heimisch ist.

# spec/support/form_helpers.rb 
module FormHelpers 
    def submit_form 
    find('input[name="commit"]').click 
    end 
end 

Dies wird

RSpec.configure do |config| 
    config.include FormHelpers, :type => :feature 
    ...etc... 
in spec_helper.rb enthalten

I :type => :feature nur verwendet, so wird Tests in der Integration darin enthalten.

In den Integrationstests können Sie es wie folgt verwenden:

scenario 'pages can be created' do 
    visit new_page_path 
    fill_in 'page_title', with: 'A Tale of Two Cities' 
    submit_form # Clicks the commit button regardless of id or text 

    expect(page).to have_content 'The page was created' 
    ...etc.. 
end 

Natürlich submit_form kann auch innerhalb within Blöcke und mit :js => true verwendet werden.

+0

Wie haben Sie es in 'rails_spec.rb' importiert? –

+1

Das hängt von Ihrer Konfiguration ab, aber Sie könnten "require" spec/support/form_helpers.rb am Anfang der Datei hinzufügen, wenn Sie den oben vorgeschlagenen Pfad verwendet haben. – IAmNaN

9

ich in der Regel:

within 'form#edit_page_1' do 
    find('input[name="page[title]"]').set "Some Value" 
    find('input[name="commit"]').click 
end 

Es liegt an den HTML-Code gebunden, sondern auf seine semantischen Eigenschaften, so fühle ich mich wie seine Ordnung. Eigentlich benutze ich nie die magischen Finder.

BTW Ich verstehe Ihren Kommentar nicht: (a user would never know/care about accessing an element that way).

Integration Spezifikationen sind für Sie, es ahmt einen Benutzer sicher aber es ist nur eine Frage der richtigen Anweisungen.

+0

hilft Generell stimme mit Ihnen überein, dass die Tests "für mich" sind. Aber sie werden auch von meinem Designer und Produktmanager gelesen, die beide alles ausblenden, was wie Code aussieht. In dieser Hinsicht war ich wirklich glücklich und ziemlich erstaunt, wie nahe der einfache englische Capybara (ohne Gurke) sein kann. Ich habe auch .click benutzt, aber der Css-Selektor ist etwas, das ich vermeiden wollte und dachte, dass es einen magischen Finder geben könnte. Ich werde es wahrscheinlich benutzen und ein Makro für die Lesbarkeit machen. – IAmNaN

+0

Wenn Sie super sauberes Makro wollen, verwenden Sie Seitenobjekte und das große https://github.com/natritmeyer/site_prism – apneadiving

0

zu verwenden versuchen:

find('input[name="commit"]').click

Es

Verwandte Themen