RSpecのフォーム入力ヘルパーを柔軟にするためにキーワード引数で値をオーバーライドしてみた!

初めに

今回RSpecのシステムスペックにてフォーム入力を簡略化するためにフォーム入力用のメソッド(fill_sign_up_form)を作成した。 しかし、このままだと柔軟に値を変更できないのでキーワード引数を利用して値を柔軟に返ることができるようにしてみた。

問題

改善前のコード
def fill_sign_up_form(user)
  fill_in 'メールアドレス', with: user.email
  fill_in '電話番号', with: user.phone_number
  select user.birthdate.year.to_s, from: 'user_birthdate_1i'
end

fill_sign_up_form(user, birthdate: Date.today + 1.day) # 値の更新ができない
  • このままではデフォルトの値から変更を加えたい場合には値の代入ができず、決まった値しか入力フォームに入力できない。
改善後のコード(キーワード引数を使用してデフォルトの値を柔軟に変更することができる)
def fill_sign_up_form(user, email: user.email, phone_number: user.phone_number, birthdate: user.birthdate)
  fill_in 'メールアドレス', with: email
  fill_in '電話番号', with: phone_number
  select birthdate.year.to_s, from: 'user_birthdate_1i'
  select birthdate.month.to_s, from: 'user_birthdate_2i'
  select birthdate.day.to_s, from: 'user_birthdate_3i'
end

fill_sign_up_form(user, birthdate: Date.today + 1.day) # ←こでオーバライドが効く!

なぜオーバーライドができるようになったのか?

  • Rubyのキーワード引数にはメソッドを呼び出す際に更新したい一部のみ明示的にキーと値を指定することで値の更新を行うことができる特徴がある。
def greet(user, name: user.name)
  puts "Hello, #{name}"
end
  • これでgreet(user, name: 'Bob')のようにしてuser.nameを上書きして更新することができる。

  • 第一引数にuserを渡していますが、これはuserのデフォルト値を設定するためにuserを第一引数に当てています。