###Micropostのバリデーション
####新しいMicropostの有効性に対するテスト
test/models/micropost_test.rb
require 'test_helper'
class MicropostTest < ActiveSupport::TestCase
def setup
@user = users(:michael)
# このコードは慣習的に正しくない
@micropost = Micropost.new(content: "Lorem ipsum", user_id: @user.id)
# micropostのカラムに情報を入力
end
test "should be valid" do
assert @micropost.valid?
# 有効?
end
test "user id should be present" do
# あらゆるマイクロポストはユーザーのidを持っているべき
@micropost.user_id = nil
# user_idをnilにする
assert_not @micropost.valid?
# 有効じゃないようね?
end
end
####マイクロポストのuser_idに対する検証
app/models/micropost.rb
class Micropost < ApplicationRecord
# ApplicationRecordを継承したモデルが作られます
belongs_to :user
# userモデルとの間に「1対1」のつながりが設定
# 割り当てる
validates :user_id, presence: true
# presence これは存在するか?
# presenceメソッドはオブジェクトが存在すればそのオブジェクトを返し、
# オブジェクトが存在しなければnilを返すメソッドとなります
end
####Micropostモデルのバリデーションに対するテスト
test/models/micropost_test.rb
require 'test_helper'
class MicropostTest < ActiveSupport::TestCase
def setup
@user = users(:michael)
# このコードは慣習的に正しくない
@micropost = Micropost.new(content: "Lorem ipsum", user_id: @user.id)
end
test "should be valid" do
assert @micropost.valid?
# 有効?
end
test "user id should be present" do
# あらゆるマイクロポストはユーザーのidを持っているべき
@micropost.user_id = nil
# user_idをnilにする
assert_not @micropost.valid?
# 有効じゃないようね?
end
test "content should be present" do
@micropost.content = " "
# contentが無い
assert_not @micropost.valid?
# 有効じゃ無いよね?
end
test "content should be at most 140 characters" do
@micropost.content = "a" * 141
# 141文字にする
assert_not @micropost.valid?
# 有効じゃ無いよね
end
end
####Micropostモデルのバリデーション
app/models/micropost.rb
class Micropost < ApplicationRecord
# ApplicationRecordを継承したモデルが作られます
belongs_to :user
# userモデルとの間に「1対1」のつながりが設定
# 割り当てる
validates :user_id, presence: true
# presence これは存在するか?
# presenceメソッドはオブジェクトが存在すればそのオブジェクトを返し、
# オブジェクトが存在しなければnilを返すメソッドとなります
validates :content, presence: true, length: { maximum: 140 }
# 最大140文字まで
end
ubuntu:~/environment/sample_app (user-microposts) $ rails test:models
Started with run options --seed 8840
14/14: [============================] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.32843s
14 tests, 22 assertions, 0 failures, 0 errors, 0 skips
###演習
1.
Railsコンソールを開き、user_idとcontentが空になっているmicropostオブジェクトを作ってみてください。このオブジェクトに対してvalid?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?
>> micropost.errors.full_messages
=> ["User must exist", "User can't be blank", "Content can't be blank"]
コンソールを開き、今度はuser_idが空でcontentが141文字以上のmicropostオブジェクトを作ってみてください。このオブジェクトに対してvalid?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?
>> micropost.content = "a" * 142
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>> micropost.valid?
=> false
>> micropost.errors.full_messages
=> ["User must exist", "User can't be blank", "Content is too long (maximum is 140 characters)"]