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