はじめに
今回は爆速でモデルのテストを書き上げます!!
ぜひ参考に!!
前提
今回はUserモデルを例にとってテストを書き上げていきます!!
テーブル
カラム名 | 型 | オプション |
---|---|---|
This | null: false | |
encrypted_password | string | null: false |
nickname | string | |
introduction | text |
※deviseを導入しているのでもう少しカラムがありますが、省略します。
バリデーション
user.rb
class User < ApplicationRecord
〜省略〜
validates :nickname, presence: true, length: { maximum: 6 }
validates :introduction, presence: true
end
rspecの導入
Gemfile
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails'
end
group :development do
gem 'web-console'
end
※web_console というgemはtest環境で動かすと不具合が起きる可能性があるgemなのでdevelopment環境でのみ動くようにします。
ターミナル
bundle install
ターミナル
rails g rspec:install
次のようなファイルが生成されます。
ターミナル
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
作成された.rspecに以下を追加
.rspec
--format documentation
rspec確認
ターミナル
bundle exec rspec
ターミナル
No examples found.
Finished in 0.00111 seconds (files took 0.19535 seconds to load)
0 examples, 0 failures
こんな感じになればOKです。
下準備
その中にfactoriesディレクトリとmodelディレクトリを作成しましょう。
その後、
factoriesディレクトリの中にはusers.rb
modelディレクトリの中にはuser_spec.rb
というファイルを作成しましょう。
テストコードの記載
まずはspec/factories/user.rbにサンプルデータを作成します。
spec/factories/user.rb
FactoryBot.define do
factory :user do
nickname {"山田太郎"}
introduction {"こんにちは"}
email {"sample@gmail.com"}
password {"00000000"}
password_confirmation {"00000000"}
end
end
テストコードを書いていきます。
spec/model/user_spec.rb
require 'rails_helper'
describe User do
describe '#create' do
it "ニックネームがないと登録できない" do
user = build(:user, nickname: nil)
user.valid?
expect(user.errors[:nickname]).to include("can't be blank")
end
it "ニックネームが7文字以上では登録できない " do
user = build(:user, nickname: "aaaaaaaa")
user.valid?
expect(user.errors[:nickname][0]).to include("is too long")
end
it "自己紹介がないと登録できない" do
user = build(:user, introduction: nil)
user.valid?
expect(user.errors[:introduction]).to include("can't be blank")
end
it "e-mailがないと登録できない" do
user = build(:user, email: nil)
user.valid?
expect(user.errors[:email]).to include("can't be blank")
end
it "パスワードがないと登録できない" do
user = build(:user, password: nil)
user.valid?
expect(user.errors[:password]).to include("can't be blank")
end
it "パスワード確認がないと登録できない" do
user = build(:user, password_confirmation: "")
user.valid?
expect(user.errors[:password_confirmation]).to include("doesn't match Password")
end
it "全て満たしていれば登録できる" do
user = build(:user)
expect(user).to be_valid
end
end
end
テストコードのポイントは失敗例と成功例両方書いておくことです。
書けましたね。ターミナルで確認してみましょう!!!
ターミナル
bundle exec rspec
ターミナル
User
#create
ニックネームがないと登録できない
ニックネームが7文字以上では登録できない
自己紹介がないと登録できない
e-mailがないと登録できない
パスワードがないと登録できない
パスワード確認がないと登録できない
全て満たしていれば登録できる
Finished in 0.45572 seconds (files took 4.21 seconds to load)
7 examples, 0 failures
こんな感じで出れば成功です!!!
赤い文字でfailuresが出る場合はバリデーションかテストコードのどちらかが間違っているので確認してみましょう。
おわりに
とても簡単だったと思います。
今回はカラム数の少ないモデルでテストを行いましたが、カラム数が増えてもやることは同じです。
ぜひ参考にテストコードを書いてみましょう。
では