今回は異常系テストについて書いていきます。
前回はこちら
その①Rspec Userモデルの単体テストの手順
その②(正常系)Rspec Userモデルの単体テストの手順
Userモデルの正常系テストについて書いていきます。
ここではバリデーションに関するテストを実装致します。
異常系テストとは、
対象が想定外のことを起こして、きちんと対処できるか確認する作業
正常系テストがユーザーが開発者の意図する操作を行った時の
挙動を確認するテストコードならばその逆。
開発者の意図しない操作を行った場合の挙動を調べます!
正常系テストがうまくいったときで
異常系テストがうまくいかなかったときですね。
雛形
require 'rails_helper'
describe User do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録がうまくいくとき' do
it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
end
it "nicknameが6文字以下で登録できる" do
end
it "passwordが6文字以上であれば登録できる" do
end
end
context '新規登録がうまくいかないとき' do
it "nicknameが空だと登録できない" do
end
it "nicknameが7文字以上であれば登録できない" do
end
it "emailが空では登録できない" do
end
it "重複したemailが存在する場合登録できない" do
end
it "passwordが空では登録できない" do
end
it "passwordが5文字以下であれば登録できない" do
end
it "passwordが存在してもpassword_confirmationが空では登録できない" do
end
end
end
end
テストコードの記述
be_validマッチャを使用します。
itとendの中に記述していきます。(正常系と一緒)
expectのインスタンスが正しく保存されることを確認できます。
expect(インスタンス).to be_validのように使用してください。
require 'rails_helper'
describe User do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録がうまくいくとき' do
it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do
end
it "nicknameが6文字以下で登録できる" do
end
it "passwordが6文字以上であれば登録できる" do
end
end
context '新規登録がうまくいかないとき' do
it 'nicknameが空では登録できない' do
@user.nickname = ''
@user.valid?
expect(@user.errors.full_messages).to include("Nickname can't be blank")
end
it 'nicknameが7文字以上では登録できない' do
@user.nickname = 'aaaaaaa'
@user.valid?
expect(@user.errors.full_messages).to include('Nickname is too long (maximum is 6 characters)')
end
it 'nicknameが空では登録できない' do
@user.nickname = ''
@user.valid?
expect(@user.errors.full_messages).to include("Nickname can't be blank")
end
it '重複したemailが存在する場合登録できない' do
@user.save
another_user = FactoryBot.build(:user)
another_user.email = @user.email
another_user.valid?
expect(another_user.errors.full_messages).to include('Email has already been taken')
end
it 'passwordが空では登録できない' do
@user.password = ''
@user.valid?
expect(@user.errors.full_messages).to include("Password can't be blank")
end
it 'passwordが5文字以下では登録できない' do
@user.password = '00000'
@user.password_confirmation = '00000'
@user.valid?
expect(@user.errors.full_messages).to include('Password is too short (minimum is 6 characters)')
end
it 'passwordとpassword_confirmationが不一致では登録できない' do
@user.password_confirmation = ''
@user.valid?
expect(@user.errors.full_messages).to include("Password confirmation doesn't
match Password")
end
end
end
end
それと単体テストで気をつけてほしいのは、endの数
doとendの数は同じ分あります。
doの数が10ならばendの数も10あります。一つend抜けるとエラーになってしまうので要注意です。
validは日本語で「正しい」を意味します。
valid?とすることで「正しいかどうか」を判定するメソッドとなります。
作成したデータが正しく保存される場合はtrueを、保存されない場合はfalseを返します。
また、保存されない場合は「なぜ保存されないのか」のエラーメッセージも生成します。
もし、エラーメッセージが出てきたらbinding.pryを用いて確認します!。