RSpecのモデルスペックではバリデーションやインスタンスメソッドをテストします。
今回はバリデーションの中でも基本的なpresence: true
を取り上げてテストしてみました。
1. Postモデルのバリデーション確認
今回Postモデルにはcontentカラムが存在すること(presence: true
)がバリデーションによって制限されています。
post.rb
class Post < ApplicationRecord
validates :content, { presence: true }
end
2. モデルの要件を満たせば有効であることをテスト
itで始まる行の中にpost
というインスタンスをnewメソッドで作成します。このpost
のcontentカラムには「あああ」という文字列が入っています。
そしてbe_valid
というマッチャを用いて、作成したpost
が有効であることをテストします。
post_spec.rb
require 'rails_helper'
RSpec.describe Post, type: :model do
it "投稿内容があれば有効な状態であること" do
post = Post.new(
content: "あああ"
)
expect(post).to be_valid
end
end
bundle exec rspec
してみるとテストにが成功することが分かります。
3. モデルの要件を満たさなければ無効であることをテスト
今度はバリデーションが上手く機能しているか確認してみましょう!
contentカラムにはpresence: true
というバリデーションを付与しているので、contentカラムに何も含まれていないとpostインスタンスは無効になるはずです
post_spec.rb
require 'rails_helper'
RSpec.describe Post, type: :model do
it "投稿内容、ユーザーidがあれば有効な状態であること" do
post = Post.new(
content: "あああ"
)
expect(post).to be_valid
end
it "投稿内容が無ければ無効な状態であること" do
post = Post.new(
content: nil
)
post.valid?
expect(post.errors[:content]).to include("can't be blank")
end
end
今回はインスタンスが無効であると、content属性にエラ〜メッセージが付いてくるという特性を利用して、バリデーションが機能していることをテストしました。