質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

1回答

4717閲覧

重複したmailのテストコードが上手く表示されない(RSpec)

tanaka_name

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2020/11/02 06:25

前提・実現したいこと

新規登録の実装しております
その中で、
モデルの単体テストコードにて
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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

factory :user を見ると password が定義してありません。
このため @user.save が失敗しているので、@user.email のemailをもったレコードがDBに存在しません。
ですから email重複のエラーは出ません

投稿2020/11/02 09:26

winterboum

総合スコア23450

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanaka_name

2020/11/02 09:39 編集

factories/user.rb FactoryBot.define do factory :user do nickname {Faker::Name.name} email {Faker::Internet.free_email} password {"00000000"}←追加で記入する password_confirmation {"00000000"}←追加で記入する end end こういった認識で合ってますでしょうか??
winterboum

2020/11/02 10:20

形は合っていますが、passwordのvalidaionではねられますね
winterboum

2020/11/02 10:22

"Password can't be blank", "Password Password Include both letters and nu...ana characters", って言われてますから、Include both letters and nu...ana charactersが必要ですね。 あ "First name kana can’t be black", "First name kana Full-width katakana characters" これも満たしてね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問