前提・実現したいこと
新規登録の実装しております
その中で、
モデルの単体テストコードにて
email関連のテストコードを作ってる最中で
"重複したemailが存在する場合登録できない”時の
テストコードを表示したい
発生している問題・エラーメッセージ
"重複したemailが存在する場合登録できないこと”の テストコードが上手く表示されない(以下エラー文) 1) User ユーザー新規登録 重複したemailが存在する場合登録できないこと Failure/Error: expect(another_user.errors.full_messages).to include("Email has already been taken") expected ["Password can't be blank", "Password can't be blank", "Password Password Include both letters and nu...ana characters", "First name kana can’t be black", "First name kana Full-width katakana characters"] to include "Email has already been taken" # ./spec/models/user_spec.rb:24:in `block (3 levels) in <top (required)>' Finished in 0.1936 seconds (files took 1.56 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/models/user_spec.rb:20 # User ユーザー新規登録 重複したemailが存在する場合登録できないこと
該当のソースコード
user_spec.rb
require 'rails_helper' RSpec.describe User, type: :model do describe 'ユーザー新規登録' do before do @user = FactoryBot.build(:user) end it "nicknameが空だと登録できない" do @user.nickname = "" # nicknameの値を空にする @user.valid? expect(@user.errors.full_messages).to include("Nickname can't be blank") end it "emailが空では登録できない" do @user.email = "" # emailの値を空にする @user.valid? expect(@user.errors.full_messages).to include("Email can't be blank") end it "重複したemailが存在する場合登録できないこと" do @user.save another_user = FactoryBot.build(:user, email: @user.email) another_user.valid? expect(another_user.errors.full_messages).to include("Email has already been taken") end end end
factories/user.rb
FactoryBot.define do factory :user do nickname {Faker::Name.name} email {Faker::Internet.free_email} end end
app/models/user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :password, presence: true,format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i, message: 'Password Include both letters and numbers' } validates :nickname,:email,:birthday, presence: true validates :email, uniqueness: true validates :last_name,:first_name,:last_name_kana,:first_name_kana, presence: true, presence: {message: 'can’t be black'} validates :first_name,:last_name, format: {with:/\A[ぁ-んァ-ン一-龥]/,message: 'Full-width characters'} validates :first_name_kana,:last_name_kana, format: {with: /\A[ァ-ヶー-]+\z/,message: 'Full-width katakana characters'} end
試したこと
"重複したemailが存在する場合登録できないことの処理を一度コメントアウトにして処理を確認
→nicknameが空だと登録できない"とemailが空では登録できないの処理は上手くいっていた
インスタンス変数が間違えていると思い、
another_user.errors.full_messages @another_user.errors.full_messagesに変更
処理したところ、
Failure/Error: expect(@another_user.errors.full_messages).to include("Email has already been taken") NoMethodError: undefined method `errors' for nil:NilClass # ./spec/models/user_spec.rb:24:in `block (3 levels) in <top (required)>' Finished in 0.36447 seconds (files took 4.37 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/models/user_spec.rb:20 # User ユーザー新規登録 重複したemailが存在する場合登録できないこと
という別のエラーが表示された
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/02 09:39 編集
2020/11/02 10:20
2020/11/02 10:22