kahoxx121u
@kahoxx121u (kaho)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

モデル単体のテストコード(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

2Answer

だいたい、以下の3パターンなので、何が違っているのか確認して一つずつ解消していけば大丈夫かと思います。
気にされていた FactoryBotの問題ではありません。

1のエラー:expected ["Password confirmation doesn't match Password", "Password is invalid"] to include "Password Include both letters and numbers"

実際に発生しているエラー:確認用のパスワードがパスワードと一致しない

it 'passwordが英語のみでは登録できない' do
      @user.password = 'abcdef'
+     @user.password_confirmation = 'abcdef'
      @user.valid?
      expect(@user.errors.full_messages).to include('Password Include both letters and numbers')
end

原因:password_confirmationを設定していない

3のエラー:expected ["Surname kanji can't be blank", "Surname kanji is invalid"] to include "surnamekanji can't be blank"

実際に発生しているエラー:Surname kanjiは入力必須

it 'surname_kanjiが空では登録できない' do
      @user.surname_kanji = ''
      @user.valid?
-     expect(@user.errors.full_messages).to include("surnamekanji can't be blank")
+     expect(@user.errors.full_messages).to include("Surname kanji can't be blank")
end

原因:フィールド(attribute)名が出力されるメッセージと一致していない

7のエラー:expected ["Surname kanji is invalid"] to include "surname_kanji Full-width characters"

- validates :surname_kanji, presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]/ }
+ validates :surname_kanji, presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]/, message: 'Full-width characters'}

原因:messageを設定していないため、デフォルトのis invalidしか出ない

2Like

Comments

  1. @kahoxx121u

    Questioner

    丁寧にご教示いただきありがとうございます。勉強になりました。なんとか実装でき先に進むことができました。

その後  gimeiをbundle installして以下のように変更しました。

FactoryBot.define do
factory :user do
transient do
person { Gimei.name }
end

#ユーザー名
nickname              {Faker::Name.initials(number: 2)}
email                 {Faker::Internet.free_email}
password { "a1" + Faker::Internet.password(min_length: 6) }
password_confirmation { password }
first_name_kanji { person.first.kanji }
surname_kanji { person.last.kanji }
first_name_kana { person.first.katakana }
surname_kana { person.last.katakana }
date_of_birth { Faker::Date.backward }

end
end

0Like

Your answer might help someone💌