0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

単体テストコードでエラーメッセージすら出なかった話

Last updated at Posted at 2021-03-01

こんばんは。

本日は初投稿です。
今回の内容は単体テストコードで発生してしまったあるトラブルについてです。

WHAT

まずは下の画像をご覧ください。
単体テストコード.png

カード情報に不備があるとき、「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
バリデーションを真っ先に疑った方がいいです。

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?