2017-08-02 4 views
0

Ziel: Der Versuch, ein leeres Registrierungsformular einzureichen, schlägt aufgrund von Validierungsfehlern fehl. Erwartungen sind im Szenario als einzelne Linie (Methode) vorhanden. Fehler werden sehr genau hinsichtlich ihrer Platzierung überprüft. Ich möchte das klassische Zählen nicht verwenden, bis das der einzige Weg ist, der übrig bleibt.'undefinierte lokale Variable oder Methode' für die in die Methode exportierten erwarteten Daten in den Helper

def cant_be_blank_error_is_displayed(number_of_times = 1) 
    expect(page).to have_content t('errors.messages.blank'), count: number_of_times 
end 

require 'rails_helper' 
require 'email_helper' 

feature 'register organisation', type: :feature, js: true do 
    let!(:register_page) { RegisterPage.new } 
    let!(:login_page) { LoginPage.new } 
    let!(:organisation) { create :organisation, name: 'organisation_name' } 
    let!(:owner) { create :user, email: '[email protected]', role: :owner } 
    let(:form) { register_page.register_form } 

    before { register_page.load } 

    context 'creation fails because' do 
    scenario 'mandatory fields were left empty' do 
     register_page.submit_empty_form 
     all_mandatory_fields_cant_be_blank_error_displayed 
    # expect(form).to have_content mail_blank_or_taken_error 
    end 

    scenario (...) 
    end 
    end 

Methode:
1. Definieren spezifische Fehler als Elemente in der Seite

class RegisterPage < SitePrism::Page 
    set_url "/sign_up" 
    section :register_form, :xpath, "//*[@id='new_user']" do 
    element :email, :xpath, "//*[@id='user_email']" 
    (...) # other input fields 

# binding.pry confirms they appear on the page 
    element :mail_blank_or_taken_error, :xpath, "//*[@id='new_user']/div[2]/span" 
    element :blank_password_error, :xpath, "//*[@id='new_user']/div[4]/span" 
    element :password_too_short_error, :xpath, "//*[@id='new_user']/div[2]/div[3]/p" 
    element :mismatch_error, :xpath, "//*[@id='new_user']/div[2]/div[4]/span" 
    element :blank_name_error, :xpath, "//*[@id='new_user']/div[2]/div[5]/span" 
    element :name_taken_error, :xpath, "//*[@id='new_user']/div[2]/div[5]" 
    element :wrong_format_error, :xpath, "//*[@id='new_user']/div[7]/span 
    (...) 
    end 
end 


2. Erstellen error_alerts.rb helper zum Speichern in einer Methode erwartet

def all_mandatory_fields_cant_be_blank_error_displayed 
    [ 
    mail_blank_or_taken_error, 
    blank_password_error, 
    signs_limit_error, 
    blank_name_error, 
    blank_adress_line_error, 
    blank_city_error, 
    blank_country_error, 
    blank_zipcode_error, 
    blank_phone_number_error, 
    blank_website_error, 
    ].each do |validation_errors| 
    expect(form).to have_content validation_errors 
    end 
end 

Hindernis: Fehler sind Standardschienen diejenigen, so dass sie nicht als Übersetzungen definiert, die ich in einem anderen spec in der gleichen Konvention verwendet, und alles funktionierte einwandfrei.

Beispiel:

def invalid_email_or_password_error_displayed 
    expect(login_page).to have_content t("devise.failure.invalid", authentication_keys: "Email") 
end 

Failures: ich folgenden Fehler.

1 # mein Weg - gleiches Problem tritt für jedes Objekt aus dem |validation_errors|

1) register organisation creation fails because mandatory fields were left empty 
    Failure/Error: mail_blank_or_taken_error, 

    NameError: 
     undefined local variable or method `mail_blank_or_taken_error' for #<RSpec::ExampleGroups::RegisterOrganisation::CreationFailsBecause:0x007fe56b336370> 
# ./spec/support/error_alerts.rb:63:in `all_mandatory_fields_cant_be_blank_error_displayed' 
# ./spec/features/organisation_registration_spec.rb:16:in `block (3 levels) in <top (required)>' 

2 # klassischen

1) register organisation creation fails because mandatory fields were left empty 
    Failure/Error: expect(form).to have_content 
mail_blank_or_taken_error 

    NameError: 
     undefined local variable or method `mail_blank_or_taken_error' for # <RSpec::ExampleGroups::RegisterOrganisation: :CreationFailsBecause:0x007ff02e7b9348>#./spec/features/organisation_registration_spec.rb:17:in `block (3 levels) in <top (required)>' 

erwarten Frage: Ist mein Weg technisch Machbaren nach einigen Modifikationen oder der einzige Lösung ist die klassische Zählmethode zu verwenden? Kann die Schleife durch die Elemente der Seite iterieren? Hier ist ein Beispiel für seine ähnliche Verwendung, obwohl erwartet, sind Strings und die Schleife selbst ist in Spec-Szenario enthalten, anstatt in eine externe Methode in einem Helfer exportiert werden.

scenario "is successful" do 
     all_ministry_memberships_page.create_new(ministry, cabinet, minister) 
     [ 
     t("flash.actions.create.notice", resource_name: "Ministry membership"), 
     "Ministry " + ministry.name, 
     "Cabinet " + cabinet.name, 
     "Minister " + minister.name, 
     "Start Date " + (cabinet.appointment_date + 2.days).strftime("%Y-%m-%d"), 
     "Created At " + ministry_membership.created_at.strftime("%B %0e, %Y %H:%M"), 
     "Updated At " + ministry_membership.updated_at.strftime("%B %0e, %Y %H:%M"), 
     ].each do |form_input| 
     expect(form).to have_content form_input 
     end 
    end 

Antwort

0

Diese

[ 
    mail_blank_or_taken_error, 
    blank_password_error, 
] 

bedeutet "Anrufverfahren mail_blank_or_taken_error(), dann blank_password_error() und deren Ergebnisse in einem Array setzen". Sie haben solche Methoden nicht, und das sagt Ihnen die Fehlermeldung. Wenn Sie möchten, dass diese Zeichenfolgen sind, machen Sie sie Zeichenfolgen.

[ 
    "mail_blank_or_taken_error", 
    "blank_password_error", 
] 

oder

%w[ 
    mail_blank_or_taken_error 
    blank_password_error 
] 
+0

Dieses analysiert und page_object Referenz ist nicht gerade der Effekt, den ich erreichen wollte, weil 'mail_black_or_taken_error' ein Name Fehlerelement ist definiert in' register_page'. Nicht ein Text auf der Website, so habe ich diesen Fehler: '1) Registrierung Organisationserstellung schlägt fehl, da Pflichtfelder leer gelassen wurden ' Fehler/Fehler: erwarten (Formular) .to have_content validation_errors erwartet, Text zu finden "mail_blank_or_taken_error," in „Bitte beachten sie die Probleme überprüfen unten: * EMAIL nicht bLank' werden kann Diese 1 läuft: ' [ "EMAIL nicht leer sein", blank_password_error, ] .' aber es doesn Überprüfen Sie die Platzierung des Textes – Zelka

+0

@Zelka: Nun, wissen Sie nicht schon, wie man i18n-Schlüssel in übersetzte Zeichenfolgen umwandelt (Tipp: sehen Sie sich Ihr Arbeitsbeispiel an) –

+0

Erstellen Übersetzungen sind nicht immer der gewünschte Effekt. Außerdem ist es zeitaufwendiger. ;) Ich habe eine Lösung für mein Problem gefunden. Wird es posten. – Zelka

0

fand ich Lösung für dieses Problem.

Das Verfahren benötigt die richtige Argument

def all_mandatory_fields_cant_be_blank_error_displayed_in(form) 
    [ 
    form.blank_password_error, 
    form.signs_limit_error, 
    form.blank_name_error, 
    form.blank_adress_line_error, 
    form.blank_city_error, 
    form.blank_country_error, 
    form.blank_zipcode_error, 
    form.blank_phone_number_error, 
    form.blank_website_error, 
    ].each do |validation_error| 
    expect(validation_error).to be_present 
    end 
end 
Verwandte Themen