2017-10-03 12 views
0

一部は、このフォームフィールドから大学を選択する必要があります。ここではカピバラアクション整数(ID)対文字列(名前)混乱

<div class="js-dependent-fields" data-select-id="user_role" data-option-value="staff"> 
    <div class="form-group"> 
    <%= form.label :university %> 
    <%= form.select :university_id, options_for_select(University.all.map{ |uni| [uni.name, uni.id] }), {prompt: 'Select Your University'}, { class: "form-control" } %> 
    </div> 
</div> 

は、実際のHTMLです:

ここ
<div class="js-dependent-fields" data-select-id="user_role" data-option-value="staff"> 
    <div class="form-group"> 
    <label for="user_university">University</label> 
    <select class="form-control" name="user[university_id]" id="user_university_id"><option value="">Select Your University</option> 
<option value="1">Harvard</option></select> 
    </div> 

私が得るエラーです:

test_signup_valid_user           ERROR (0.05s) 
Capybara::ElementNotFound:   Capybara::ElementNotFound: Unable to find visible option "Harvard University" 
      test/integration/boarding_flow_test.rb:63:in `block in <class:BoardingFlowTest>' 

フォームが送信されるとき、これはパラメータの一部として渡すものの例です以下の試験で

"university_id"=>"4" 

私が大学を選択したい、と私は私のようなものと考えることができ、すべての組み合わせを試してみた:

page.select "3", from: "university_id" 
page.select "Harvard University", from: "University" 

をしかし、私はそれを動作させるように見えることはできません。これを行う適切な方法は何ですか?ありがとう!ここで

test 'signup valid user' do 
    visit sign_up_path 

    fill_in "First name", with: "John" 
    fill_in "Last name", with: "Doe" 
    fill_in "Email", with: "[email protected]" 
    fill_in "Password", with: "foobar" 
    page.select "Staff", from: "Role" 
    page.select "3", from: "university_id" 

    click_on "Signup" 

    assert_equal sign_in_path, current_path 
    assert page.has_content?("confirm your email") 
    end 

は、ここでユーザー/ new.html.erb

<div class="row"> 
    <div class="col-sm-8 col-md-4 col-sm-offset-2 col-md-offset-4"> 
    <div class="login-panel panel panel-default"> 
     <div class="panel-heading"> 
     <h3 class="panel-title">Signup</h3> 
     </div> 
     <div class="panel-body"> 
     <%= form_for @user do |form| %> 
      <fieldset> 
      <%= render partial: '/users/form', object: form %> 

      <%= form.submit t(".submit"), class: "btn btn-md btn-success btn-block" %> 
      <hr> 
      <h5 class="text-center">Already have an account?</h5> 
      <%= link_to t(".login"), sign_in_path, class: "btn btn-md btn-info btn-block" %> 
      </fieldset> 
     <% end %> 
     </div> 
    </div> 
    </div> 
</div> 

である部分の形だ

<div class="form-group"> 
    <%= form.label :first_name %> 
    <%= form.text_field :first_name, class: "form-control" %> 
</div> 

<div class="form-group"> 
    <%= form.label :last_name %> 
    <%= form.text_field :last_name, class: "form-control" %> 
</div> 

<div class="form-group"> 
    <%= form.label :email %> 
    <%= form.text_field :email, type: 'email', class: "form-control" %> 
</div> 

<div class="form-group"> 
    <%= form.label :password %> 
    <%= form.password_field :password, class: "form-control" %> 
</div> 

<div class="form-group"> 
    <%= form.label :role %> 
    <%= form.select :role, options_for_select(User.roles.keys.map{ |role| [User.human_attribute_name("role.#{role}"), role] }), {}, { class: "form-control" } %> 
</div> 

<div class="js-dependent-fields" data-select-id="user_role" data-option-value="staff"> 
    <div class="form-group"> 
    <%= form.label :university %> 
    <%= form.select :university_id, options_for_select(University.all.map{ |uni| [uni.name, uni.id] }), {prompt: 'Select Your University'}, { class: "form-control" } %> 
    </div> 
</div> 
+0

FYI - これはあなたの現在の問題ではありませんが、 'assert_equal'と' assert'ではなくCapybaraが提供するアサーションを使用する必要があります。カピバラは、不安定なテストを防ぐために、アサーションに待機/再試行の動作を提供しました。 'assert page.has_content?(...)'の代わりに 'assert_equal ...'と 'assert_content("あなたの電子メールを確認する) "の代わりに' assert_current_path(sign_in_path) 'を返します –

答えて

1

page.selectを使用して - 主なパラメータが一致している使用して "オプション 'セレクタタイプ - https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb#L413 - および:fromオプションは'セレクタ'セレクタタイプ - https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb#L358を使用して一致させます。つまり、:fromオプションは、HTML <select>要素の名前、id、プレースホルダまたは関連するラベルテキストと一致し、メインパラメータは選択可能オプションのテキストと一致します。あなたは、ページの実際のHTMLまたはあなたが上で「form.select」を呼んでいるformオブジェクトの詳細を表示しない - それは、ユーザオブジェクトの場合がある場合には、

page.select("Harvard", from: 'user_university_id') # assuming the id of the actual select is 'user_university_id' 

のようなものかもしれません一つだけ、あなたも自分の試みがうまくいかなかった理由の

page.select "Harvard" 

を行うことができ、「ハーバード大学」のオプションでページにされた選択理由 -

# Doesn't work because "3" isn't the readable text of the option and 
# 'university_id' is not the id of the select element 
page.select "3", from: "university_id" 

# Doesn't work because "University" is not the label text associated 
# with the select. This is because your partials label line would need to be 
# form.label :university_id, "University" 
# to link the label with the university_id select element. Additionally 
# "Harvard University" isn't actually the text shown in your HTML - it's just "Harvard" 
page.select "Harvard University", from: "University" 

このすべてassumページ上の可視要素は実際には<select>要素であり、JS駆動ウィジェットではありません(ラッピング部分のjs-dependent-fieldsのクラスがそれを示す傾向があります)。表示されている要素がJSウィジェットである場合、page.selectはHTML <select>要素でのみ機能し、ページ上に表示される選択ウィジェットの実際のHTMLを表示する必要があるため、このすべてがウィンドウに表示されます。

+0

Thanks Thomas - 大学のドロップダウンは隠されていますスタッフが役割として選択されていない限り。 – mike9182

+0

@ mike9182私の答えのコードでは、あなたが望むものを選択しないと、その要素に割り当てられた実際のIDが何であるかを見ることができるように、ページのそのセクション(erbではなく)選択しようとする前に 'puts page.html'のようなことをすることで、HTML全体を得ることができます。また、あなたの質問に正確なエラーを追加してください。 –

+0

トーマスに助けてくれてありがとう - 私はあなたのコードを使って得た質問と正確なエラーに関連するHTMLを追加しました。 – mike9182

関連する問題