モデル単体のテストコード(factorybot)
Q&A
Closed
モデル単体のテストコードを完成させたい。
例)
ユーザーモデル単体のテストコードを記載しています。
エラーが出て先に進めません。
バリデーションもfactorybot内も確認したつもりですが、自力で解決できそうにありませんので、
ヒントを教えていただけると嬉しいです。
よろしくお願いいたします。
発生している問題・エラー
User
#create
ユーザー新規登録
新規登録できるとき
全ての項目の入力が存在すれば登録できる
新規登録できないとき
nicknameが空では登録できない
emailが空では登録できない
passwordが空では登録できない
passwordとpassword_confirmationが不一致では登録できない
重複したemailが存在する場合は登録できない
emailは@を含まないと登録できない
passwordが5文字以下では登録できない
passwordが英語のみでは登録できない (FAILED - 1)
passwordが数字のみでは登録できない (FAILED - 2)
surname_kanjiが空では登録できない (FAILED - 3)
first_name_kanjiが空では登録できない (FAILED - 4)
surname_kanaが空では登録できない (FAILED - 5)
first_name_kanaが空では登録できない (FAILED - 6)
surname_kanjiが全角入力でなければ登録できない (FAILED - 7)
first_name_kanjiが全角入力でなければ登録できない (FAILED - 8)
surname_kana_kanaが全角入力でなければ登録できない (FAILED - 9)
first_name_kanaが全角入力でなければ登録できない (FAILED - 10)
date_of_birthが空では登録できない (FAILED - 11)
Failures:
1) User#create ユーザー新規登録 新規登録できないとき passwordが英語のみでは登録できない
Failure/Error: expect(@user.errors.full_messages).to include('Password Include both letters and numbers')
expected ["Password confirmation doesn't match Password", "Password is invalid"] to include "Password Include both letters and numbers"
# ./spec/models/user_spec.rb:59:in `block (5 levels) in <top (required)>'
2) User#create ユーザー新規登録 新規登録できないとき passwordが数字のみでは登録できない
Failure/Error: expect(@user.errors.full_messages).to include('Password Include both letters and numbers')
expected ["Password confirmation doesn't match Password", "Password is invalid"] to include "Password Include both letters and numbers"
# ./spec/models/user_spec.rb:64:in `block (5 levels) in <top (required)>'
3) User#create ユーザー新規登録 新規登録できないとき surname_kanjiが空では登録できない
Failure/Error: expect(@user.errors.full_messages).to include("surnamekanji can't be blank")
expected ["Surname kanji can't be blank", "Surname kanji is invalid"] to include "surnamekanji can't be blank"
# ./spec/models/user_spec.rb:69:in `block (5 levels) in <top (required)>'
4) User#create ユーザー新規登録 新規登録できないとき first_name_kanjiが空では登録できない
Failure/Error: expect(@user.errors.full_messages).to include("firstname_kanji can't be blank")
expected ["First name kanji can't be blank", "First name kanji is invalid"] to include "firstname_kanji can't be blank"
# ./spec/models/user_spec.rb:74:in `block (5 levels) in <top (required)>'
5) User#create ユーザー新規登録 新規登録できないとき surname_kanaが空では登録できない
Failure/Error: expect(@user.errors.full_messages).to include("surname_kana can't be blank")
expected ["Surname kana can't be blank", "Surname kana is invalid"] to include "surname_kana can't be blank"
# ./spec/models/user_spec.rb:79:in `block (5 levels) in <top (required)>'
6) User#create ユーザー新規登録 新規登録できないとき first_name_kanaが空では登録できない
Failure/Error: expect(@user.errors.full_messages).to include("first_name_kana can't be blank")
expected ["First name kana can't be blank", "First name kana is invalid"] to include "first_name_kana can't be blank"
# ./spec/models/user_spec.rb:84:in `block (5 levels) in <top (required)>'
7) User#create ユーザー新規登録 新規登録できないとき surname_kanjiが全角入力でなければ登録できない
Failure/Error: expect(@user.errors.full_messages).to include("surname_kanji Full-width characters")
expected ["Surname kanji is invalid"] to include "surname_kanji Full-width characters"
# ./spec/models/user_spec.rb:89:in `block (5 levels) in <top (required)>'
8) User#create ユーザー新規登録 新規登録できないとき first_name_kanjiが全角入力でなければ登録できない
Failure/Error: expect(@user.errors.full_messages).to include("first_name_kanji Full-width characters")
expected ["First name kanji is invalid"] to include "first_name_kanji Full-width characters"
# ./spec/models/user_spec.rb:94:in `block (5 levels) in <top (required)>'
9) User#create ユーザー新規登録 新規登録できないとき surname_kana_kanaが全角入力でなければ登録できない
Failure/Error: expect(@user.errors.full_messages).to include("surname_kana Full-width characters")
expected ["Surname kana is invalid"] to include "surname_kana Full-width characters"
# ./spec/models/user_spec.rb:99:in `block (5 levels) in <top (required)>'
10) User#create ユーザー新規登録 新規登録できないとき first_name_kanaが全角入力でなければ登録できない
Failure/Error: expect(@user.errors.full_messages).to include("first_name_kana Full-width characters")
expected ["First name kana is invalid"] to include "first_name_kana Full-width characters"
# ./spec/models/user_spec.rb:104:in `block (5 levels) in <top (required)>'
11) User#create ユーザー新規登録 新規登録できないとき date_of_birthが空では登録できない
Failure/Error: expect(@user.errors.full_messages).to include("date_of_birth can't be blank")
expected ["Date of birth can't be blank"] to include "date_of_birth can't be blank"
# ./spec/models/user_spec.rb:109:in `block (5 levels) in <top (required)>'
User_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
describe '#create' do
before do
@user = FactoryBot.build(:user)
end
describe 'ユーザー新規登録' do
context '新規登録できるとき' do
it '全ての項目の入力が存在すれば登録できる' do
expect(@user).to be_valid
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 'emailが空では登録できない' do
@user.email = ''
@user.valid?
expect(@user.errors.full_messages).to include("Email can't be blank")
end
it 'passwordが空では登録できない' do
@user.password = ''
@user.valid?
expect(@user.errors.full_messages).to include("Password can't be blank")
end
it 'passwordとpassword_confirmationが不一致では登録できない' do
@user.password = '123456'
@user.password_confirmation = '1234567'
@user.valid?
expect(@user.errors.full_messages).to include("Password confirmation doesn't match Password")
end
it '重複したemailが存在する場合は登録できない' do
@user.save
another_user = FactoryBot.build(:user, email: @user.email)
another_user.email = @user.email
another_user.valid?
expect(another_user.errors.full_messages).to include('Email has already been taken')
end
it 'emailは@を含まないと登録できない' do
@user.email = 'testmail'
@user.valid?
expect(@user.errors.full_messages).to include('Email is invalid')
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が英語のみでは登録できない' do
@user.password = 'abcdef'
@user.valid?
expect(@user.errors.full_messages).to include('Password Include both letters and numbers')
end
it 'passwordが数字のみでは登録できない' do
@user.password = '123456'
@user.valid?
expect(@user.errors.full_messages).to include('Password Include both letters and numbers')
end
it 'surname_kanjiが空では登録できない' do
@user.surname_kanji = ''
@user.valid?
expect(@user.errors.full_messages).to include("surnamekanji can't be blank")
end
it 'first_name_kanjiが空では登録できない' do
@user.first_name_kanji = ''
@user.valid?
expect(@user.errors.full_messages).to include("firstname_kanji can't be blank")
end
it 'surname_kanaが空では登録できない' do
@user.surname_kana = ''
@user.valid?
expect(@user.errors.full_messages).to include("surname_kana can't be blank")
end
it 'first_name_kanaが空では登録できない'do
@user.first_name_kana = ''
@user.valid?
expect(@user.errors.full_messages).to include("first_name_kana can't be blank")
end
it 'surname_kanjiが全角入力でなければ登録できない'do
@user.surname_kanji = 'アアア'
@user.valid?
expect(@user.errors.full_messages).to include("surname_kanji Full-width characters")
end
it 'first_name_kanjiが全角入力でなければ登録できない'do
@user.first_name_kanji = 'アアア'
@user.valid?
expect(@user.errors.full_messages).to include("first_name_kanji Full-width characters")
end
it 'surname_kana_kanaが全角入力でなければ登録できない'do
@user.surname_kana = 'あいうえお'
@user.valid?
expect(@user.errors.full_messages).to include("surname_kana Full-width characters")
end
it 'first_name_kanaが全角入力でなければ登録できない'do
@user.first_name_kana = 'あいうえお'
@user.valid?
expect(@user.errors.full_messages).to include("first_name_kana Full-width characters")
end
it 'date_of_birthが空では登録できない' do
@user.date_of_birth = ''
@user.valid?
expect(@user.errors.full_messages).to include("date_of_birth can't be blank")
end
end
end
end
end
#バリデーション
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :items
has_many :purchases
validates :nickname, presence: true
VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
validates :password, format: { with: VALID_PASSWORD_REGEX }
validates :surname_kanji, presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]/ }
validates :first_name_kanji, presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]/ }
validates :surname_kana , presence: true, format: { with: /\A[ァ-ヶー-]+\z/ }
validates :first_name_kana, presence: true, format: { with: /\A[ァ-ヶー-]+\z/ }
validates :date_of_birth, presence: true
end
以下のようなバリデーションを設定しているつもりです。
ニックネームが必須であること。
メールアドレスが必須であること。
メールアドレスが一意性であること。
メールアドレスは、@を含む必要があること。
パスワードが必須であること。
パスワードは、6文字以上での入力が必須であること
パスワードは、半角英数字混合での入力が必須であること
パスワードとパスワード(確認)は、値の一致が必須であること。
0