2017-08-02 4 views
0

目標:検証エラーのために空のレジスタフォームを送信しようとすると失敗します。期待値は、シナリオでは単一行(メソッド)として存在します。エラーは、その配置に関して非常に正確にチェックされています。私はそれが残される唯一の方法であるまで、古典的な数え方を使用したくありません。'未定義のローカル変数またはメソッド'は、ヘルパーのメソッドにエクスポートされます。

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 

方法:
1ページ内の要素

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として、特定のエラーを定義店にerror_alerts.rbヘルパーを作成します。一つの方法

に期待します
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 

障害: エラーがデフォルトレールのものですので、彼らは私が同じ大会に別の仕様で使用され、すべてが完璧に働いた翻訳、として定義されていません。

例:

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

障害:私は次のエラーを取得します。

1#私の方法 - 同じ問題が期待|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#古典から各オブジェクトに対して発生し

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)>' 

質問:は私の方法いくつかの変更または後に技術的に達成可能です唯一の解決策は、古典的な計数方法を使用することですか?ページの要素を反復処理できますか?ここではシンプルな使い方の例ですが、期待は文字列であり、ループ自体はヘルパーの外部メソッドにエクスポートされるのではなく、仕様のシナリオに含まれています。

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 

答えて

0

この

[ 
    mail_blank_or_taken_error, 
    blank_password_error, 
] 

"blank_password_error()、その後、呼び出し方法mail_blank_or_taken_error()を、配列にその結果を置く" を意味します。あなたはそのようなメソッドを持っていません、そして、それはエラーメッセージがあなたに伝えるものです。それらを文字列にしたい場合は、文字列にします。

[ 
    "mail_blank_or_taken_error", 
    "blank_password_error", 
] 

または

%w[ 
    mail_blank_or_taken_error 
    blank_password_error 
] 
+0

mail_black_or_taken_error'がregister_page' 'で定義されたエラー要素の名前である'これは、私が達成したかった正確な効果ではありません。 '1)必須フィールドが空のままになっているため登録組織の作成に失敗しました ' '失敗/エラー:expect(form).to have_content validation_errors テキストを見つけることが期待されています .'「[ 、 blank_password_error、EMAIL "は空白にすることはできませんが、それはdoesnの ] '::* EMAILは この1回のパスをblank'することはできません、以下の問題を確認してください" "mail_blank_or_taken_error" にテキストの配置を確認しない – Zelka

+0

@Zelka:まあ、i18nキーを翻訳された文字列に変換する方法は分かっていませんか?(ヒント:作業例を見てください) –

+0

作成翻訳は依然として望ましい効果ではありません。さらに、時間がかかります。 ;)私は自分の問題を解決しました。投稿します。 – Zelka

0

私は、この問題に対する解決策を見つけました。

必要な適切な引数が解析された方法とpage_object参照

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 
関連する問題