こんばんは。
本日は初投稿です。
今回の内容は単体テストコードで発生してしまったあるトラブルについてです。
WHAT
カード情報に不備があるとき、「Token」がないとしたテストコードでエラーが発生していますね。
これは何が発生しているのかというとエラーを期待する私に対してコンピュータが「エラーなんて発生していない」と返答をしているのです。
医者と患者を例にすると患者が「私風邪っぽいです」と申告したとします。
Failure/Error: expect(@address_form.errors.full_messages).to include("Token can't be blank")
「ウチ風邪っぽいねん」
それに対して
expected [] to include "Token can't be blank"
「いや健康でっせ」
医者は診断の結果「健康です」と返してきました。
何が原因なのでしょうか?探っていきましょう。
WHY
まず原因として考えられるのは、
単体テストコードの記述ミス(スペルミス、構文エラー)ですが、もしもこれが正解なら
ターミナルにはsyntaxエラーという別の返答を期待しますよね。
しかし、今回の事例ではそのような記載はなかったのでこの仮説はなしです。
では何が原因か?
それはバリデーションにありました。
今回に限らず言えることとしてテストコードとは自分のかけたバリデーションがうまく機能しているのかを確かめる言わば「答え合わせ」です。
そんな答え合わせで発生した今回の事例modelsを見に行きましょう。
with_options presence: true do
validates :user_id
validates :item_id
validates :street_address, format: {with:/\A[ぁ-んァ-ン一-龥々]/, message: "Can't be blank"}
validates :postal_code, format: { with:/\A\d{3}[-]\d{4}\z/ , message: "is invalid. Include hyphen(-)" }
validates :municipality, format: { with: /\A[ぁ-んァ-ヶ一-龥々]+\z/, message: "is invalid"}
はい、Tokenにバリデーションをかけていないどころかそれすらありません。
これが原因ですね。
というわけで
validates :token
としたことで事案は解消しました。
結論
今回の件で学んだこととしてテストコードから返されるメッセージが空白[]の場合、
expected [] to include
バリデーションを真っ先に疑った方がいいです。