RSpecでセレクトボックスの選択文字を出力する方法

RSpecでセレクトボックスの選択文字を出力する方法

RSpecでセレクトボックスの選択文字を出力する方法を自分の備忘録としてこちらにまとめます。

以下のようなセレクトボックスがあります。

<select class="search-select-form" name="q[fish_kind_eq]" id="q_fish_kind_eq">
  <option value="">魚の種類(必須)</option>
  <option value="アジ">アジ</option>
  <option value="マメアジ">マメアジ</option>
  <option value="イカ">イカ</option>
  <option value="サバ">サバ</option>
  <option value="マハゼ">マハゼ</option>
  <option value="カサゴ">カサゴ</option>
  <option value="タチウオ">タチウオ</option>
  <option value="カワハギ">カワハギ</option>
  <option value="イシモチ">イシモチ</option>
  <option value="メジナ">メジナ</option>
  <option value="タコ">タコ</option>
</select>

この時にセレクトボックスの中にある選択肢は、以下のようにして取り出せます。

[1] pry(#<RSpec::ExampleGroups::SearchCookings::Nested::Nested::Nested_4>)> within('#q_fish_kind_eq') do
[1] pry(#<RSpec::ExampleGroups::SearchCookings::Nested::Nested::Nested_4>)*   texts = all('option').map(&:text)
[1] pry(#<RSpec::ExampleGroups::SearchCookings::Nested::Nested::Nested_4>)* end  
=> ["魚の種類(必須)", "アジ", "マメアジ", "イカ", "サバ", "マハゼ", "カサゴ", "タチウオ", "カワハギ", "イシモチ", "メジナ", "タコ"]

上記のイメージは、以下のようになる。
within('#q_fish_kind_eq') do〜endで範囲を指定する。

all('option')で全てのoption要素を取得して、mapメソッドにtextメソッドを引数で渡すことにより選択肢の中身が配列として取得できる。
※ textメソッドの動きは、以下のようになる。

[1] pry(#<RSpec::ExampleGroups::SearchCookings::Nested::Nested::Nested_4>)> all('option').first        #全てのoption要素を取得
=> #<Capybara::Node::Element tag="option" path="/HTML/BODY[1]/DIV[1]/DIV[1]/DIV[1]/DIV[1]/FORM[1]/DIV[1]/SELECT[1]/OPTION[1]">
[1] pry(#<RSpec::ExampleGroups::SearchCookings::Nested::Nested::Nested_4>)> all('option').first.text     #全てのoption要素の内1番最初のものを取得して、それにtextメソッドを実行
=> "魚の種類(必須)"

mapメソッドの動きは、以下のようになる。(ブロック内の処理をした新しい配列が取得できる)

[1] pry(main)> a = ['a', 'b', 'c', 'd'].map do |f|
[1] pry(main)*   f.upcase
[1] pry(main)* end  
=> ["A", "B", "C", "D"]
[2] pry(main)> a
=> ["A", "B", "C", "D"]

参考記事

Capybaraでセレクトボックスのoptionの内容だけを取得するにはどうすればよいでしょうか?