LoginSignup
2
0

More than 3 years have passed since last update.

RSpecで単体テストしようと思ったらバリデーションが足らないことが判明しました。

Last updated at Posted at 2021-04-14

テストコードを調べながらコーディングしていたら結局、バリデーションかけ忘れが発覚してバリデーションを調べていく羽目になりました。とほほ

参考

https://qiita.com/iamu_TECH_CAMP/items/d10ffa4f7fa3afaa61b6

目的

テストコードとして
・パスワードは英数混合かつ半角以外は登録できない
・名前(姓・名で分割入力)は漢字・ひらがな・全角カタカナ以外は登録できない
・読みがな(姓・名分割入力)は全角カタカナ以外登録できない

としたい

できればある程度DRY(繰り返しを避ける)ためにコードもまとめたい

疑問1

空欄しない「presence :trueは浮かぶが全角カタカナで登録という文字指定・文字サイズ指定はどうするのか?

*(参考)バリデーションを定義すると、下記のメソッドが動く前に必ず検証が行われます。
save/create/update

length(文字数制限)

#最低でも3文字以上
validates :カラム名, length: { minimum: 3 } 
#3文字以内
validates :カラム名, length: { maximum: 3 } 
#5文字から10文字以内
validates :カラム名, length: { in: 5..10 } 
#6文字ピッタリ
validates :カラム名, length: { is: 6 } 
オプション名 内容
minimum 最小値を指定
maximum 最大値を指定
in 長さの範囲を指定
is 値の長さを指定

format

正規表現とフォーマットに入力された値が合致するかの検証
withオプションと併用して使用

下は全角カタカナのみを許可したバリデーション

validates :name, format: { with: /\A[ァ-ヶー-]+\z/ }
指定型 指定方法
全て数値(半角) /\A[0-9]+\z/
半角アルファベット(小文字) /\A[a-z]+\z/
半角アルファベット(大文字) /\A[A-Z]+\z/
半角アルファベット(大文字・小文字) /\A[a-zA-Z]+\z/
半角アルファベット(小文字・数値) /\A[a-z0-9]+\z/
半角アルファベット(大文字・数値) /\A[A-Z0-9]+\z/
全角ひらがな /\A[ぁ-んー-]+\z/
全角カタカナ /\A[ァ-ヶー-]+\z/
全角ひらがな、カタカナ /\A[ぁ-んァ-ヶー-]+\z/
半角カナ /\A[ァ-ン゙゚]+\z/
漢字 /\A[一-龥]+\z/
全角ひらがな、漢字 /\A[一-龥ぁ-ん]/
全角ひらがな、全角カタカナ、漢字 /\A[ぁ-んァ-ン一-龥]/

(参考)Rubyのバリデーション用正規表現集

https://gist.github.com/nashirox/38323d5b51063ede1d41

正規表現 意味
/\A\d{3}[-]\d{4}\z/ 郵便番号(「-」を含む且つ7桁)
greater_than_or_equal_to: 〇〇 〇〇と同じか、それ以上の数値
less_than_or_equal_to: △△ △△と同じか、それ以下の数値

formatオプション
モデルのクラスの中でvalidatesメソッドを使用する際に利用できるオプションです。format: {with: 正規表現, message: 正規表現にマッチしなかった場合のエラーメッセージ}とすることで、特定のカラムへ正規表現を用いた入力制限をすることができます。

今回設定するバリデーションでは、以下の通りの正規表現を使います。

完成したバリデーション

models/user.rb
class User < ApplicationRecord

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  with_options presence: true do
    validates :nickname, :birthday, :password_confirmation
    validates :first_name, :last_name, format: { with: /\A[ぁ-んァ-ン一-龥々]/, message: "は全角ひらがな、全角カタカナ、漢字で入力して下さい" }
    validates :last_name_prono, :first_name_prono, format: { with: /\A[ァ-ヶー-]+\z/, message: "は全角カタカナで入力して下さい" }
  end
  validates :password, :password_confirmation,
  format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "は半角英数で入力して下さい" }
end

with_options〜endで同じバリデーションをまとめているのですが、
上の方のdeviseの:validatableでパスワードの空登録禁止のバリデーションはかかっているので
with_options〜endで同じバリデーションをまとまりの中から外しています。バリデーションが2回かかり
同じメッセージ「Email cant't be blank」が2度出ないようにしています。

パスワードのwithの部分ですが

models/user.rb
format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "は半角英数で入力して下さい" }

詳しく知りたい方は

@momotaro98さんのパスワード向け正規表現 /^(?=.?[a-z])(?=.?\d)[a-z\d]{8,100}$/i を解読するを参考にしてみてください。とっても詳しいです。

https://qiita.com/momotaro98/items/460c6cac14473765ec14

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0