個人的につまずきそうだったのが、assert_notのところです。
assertにどうしてnotをつけるんだろう? そもそもassert_notの右側のところは、どうしてtrueを返すんだろう? と疑問を持ちました。
具体的には
@user.name = " "
assert_not @user.valid?
の下のコードですね。
この「@user.valid?」がどうしてtrueになるのかよく分かりませんでした。
それで、Googleで「assert_not」で検索したところ、次の記事を見つけました。
assert_not と vlaid? を使い validation が有効かどうか確認するテスト 6.2.2 存在性を検証する - Qiita
https://qiita.com/nyankote/items/e5a661b0fa2f521072d4
この記事によると、
バリデーションの有効性
user_test.rb
test "name should be present" do
@user.name = " "
assert_not @user.valid? #←バリデーションをまだ設定していないので、どんな値でも true で返ってくる。
end #なので、assert_notメソッドでエラーが起きる
test "name should be present" do ... end
の中では@userの値が空欄になっています。
もし presenceのバリデーションが有効ならば @user.valid?は false を返すため、
assert_notが成功となりエラーは起きません。しかし presenceのバリデーションが無効(もしくは未設定)の場合は、たとえ@user.nameが空欄であろうとなかろうと、
valid?メソッドはtrueを返すため、assert_notが失敗となります。
Railsではこのようにバリデーションの有効性をテストしているようです。
この文章で大事なのは、「バリデーションをまだ設定していないので、どんな値でも true で返ってくる。」という部分です。
そう、つまり、バリデーションという「検証をするもの」が設定されていないので、falseにならない……つまりtrueになるということです。
そして検証している部分「@user.valid?」がtrueだと、上のラインの「@user.name = " "」が存在性に欠けているのにtrueになってしまうから、assert_notがfalseになるというわけです。
もう少し分かりやすい説明をすると、assert_notで確認されるのは、失敗している状況(コード?)です。この場合ですと、ユーザーネームが空白になっており、これをテストで弾くことが必要です。空白のユーザーネームを弾くためには、空白のユーザーネームになった@user.valid?がバリデーションで検証されてfalseにならなければなりません。そして、falseだからこそ、assert_notという関門を通過して、全体がtrueになるわけです。
更に分かりやすく説明しますと、
- assert (引数に正しいものが入るとバリデーションを経てtrueになる→結果:assertを通過してtrueになる)
- assert_not (引数に間違えたものが入るとバリデーションを経てfalseになる→結果:assert_notを通過してtrueになる)
ということです。
〝assertは正しいものを確認し、assert_notは間違えているものを確認する〟というわけです。
すべてのassertおよびassert_notでtrueが出れば、そのテストが完了するわけですから、このような形になっているみたいです。
自分で書いておいてなんですが、確かにちょっとむずかしいです。二重否定をすることで、テストしているわけですね。
あとはfoo@bar..comがちょっと難しかったです。
rubularの結果画面で青くなってるほうがマッチしているほうだと気づくのに少し時間が掛かりました。オッチョコチョイ発動です(汗)。
演習問題については、このサイトを参考にさせて頂いています。
Ruby on Rails チュートリアル 完全攻略 概要と演習解答総まとめ - 新米パパの育児留学
https://mochikichi.hatenablog.com/entry/rails_tutorial_guide
わんこらさんの「わんこら式数学の勉強法」でもそうですが、勉強をするときに答えを見てしまうことは悪いことではありません。むしろ初見では解けない問題はたくさんありますし、延々と唸って考えても「下手な考え休むに似たり状態」になってしまいます。
答えを見ながら自分の手を動かすことで、理屈を理解して、識閾下のレベルまでDeep Learning的に学習することで、だんだん成長していきます。これは和田秀樹さんの勉強方法でも同じことが言われていました。ブロガーの、ふろむださんも似た事を言っています。
「初見の問題の答えを見るな」という教義が数学界にはあります。これは大学の数学研究者にとっての未知の問題に対するスタンスです。
大学受験であったり、方法論が確立しているプログラミングの勉強に関しては、答えを見てでもどんどん問題を解いていって、体を慣れさせることが重要だと思っています。
明日からは7章に入ります。これからもっと難しくなる思うと怖いですが、webpacker周りの環境構築に比べたら多分だいじょうぶでしょう(楽観視)。