こんにちは。
今日もRailチュートリアルを勉強している皆さんへ。
テストで悩んでませんか?
よろしければ、こちらの記事でテストの概略を復習してください。
さて、Userモデルを新たに追加する時に
nameや、mail、password が、正しく設定できているかを
validate で検証しますよね。(Rails チュートリアル第6章)
Rails チュートリアルを終えて、いいね機能をつけようと
Likeモデルを作る時に
テストをどう書いたらいいんだろ?
と悩みはげそうになったので、まとめまてみました。
チュートリアルに沿って、Userモデルで考えてみましょう!
- まず、有効なモデルオブジェクトを作る。
- そのモデルが有効かどうか、テストを行う。
- あえて、モデルオブジェクトの属性を、有効でないものに変える
- 失敗するか、テストをする。
- validates を設定!テストでGreen になるか確認する。
User モデルを作成した時のテストを、
上の順で書いていきます。
1. set up メソッドでモデルオブジェクトを作成
def setup
@user = User.new(name: "example", email: "example@example.com")
end
@userはインスタンス変数であり、
setupメソッド内で宣言しておけば、
すべてのテスト内で
、このインスタンス変数が使えるようになります。
2. そのモデルが有効かどうか、テストを行う。
assert @user.valid?
assert メソッドは、第1引数がtrue である場合に、
テストが成功したものとみなすんでしたね。
忘れてしまった方は、こちらを参照ください。
その後、rails test を行い、Green を確認します。
3,4. あえて、モデルオブジェクトの属性を有効でないものに変える
あえて、エラーにしましょう!
そして、テストしましょう! (有効じゃないよね?と確認)
@user.name = ""
assert_not @user.valid?
これは、Red になるはずです。
validates 設定前なので、name が空でも登録できちゃうんです。
5 validates を設定!テストでGreen を確認する。
ラストです。validates を設定しましょう。
validates (:name, {presence: true })
validates メソッドに{presence: true}というハッシュを渡してます。
ちなみにRails では、()は省略できて、メソッドの最後の引数としてハッシュを渡すときは、{} を省略できる
んでしたね。
なので、省略したコードはこうなります。
validates :name, presence: true
これで、rails test は Green になります。
email も同様のことを行い、最終的なコードはこうなります。
require 'test_helper'
class UserTest < ActiveSupport::TestCase
def setup
@user = User.new(name: "Example User", email: "user@example.com")
end
test "should be valid" do
assert @user.valid?
end
test "name should be present" do
@user.name = ""
assert_not @user.valid?
end
test "email should be present" do
@user.email = " "
assert_not @user.valid?
end
end
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true
end
以上となります。
モデルオブジェクトを作って
あえて、属性を変えてエラーにする。
テストでRed を確認して
validatesを設定して、テストをGreenに変える。
痺れるような、流れですね!
email でも、password も
以上の流れを意識して書いてみましょう。
それでは、第2回に続きます。(多分)