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

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

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

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

RSpec

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

Ruby on Rails

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

Q&A

解決済

2回答

3072閲覧

テストコードのエラーを解決したいです。

myxo

総合スコア2

Ruby

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

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/10 12:53

テストコードのエラーを解決したいです。

解決したいテスト内容:passwordが存在してもpassword_confirmationがない場合は登録できないこと (FAILED - 1)

ruby on railsで簡単なメモアプリを作成してます。
deviseのテストコードを書いているところ、以下のエラーが発生しました。
RSpecとFactoryBotをつかってエラーコードを書いてます。

発生している問題・エラーメッセージ

User #create email、password、password_confirmationが存在すれば登録できること emailがない場合は登録できないこと passwordがない場合は登録できないこと passwordが存在してもpassword_confirmationがない場合は登録できないこと (FAILED - 1) Failures: 1) User#create passwordが存在してもpassword_confirmationがない場合は登録できないこと Failure/Error: expect(user.errors[:password_confirmation]).to include("とパスワードの入力が一致しません") expected [] to include "とパスワードの入力が一致しません" # ./spec/models/user_spec.rb:26:in `block (3 levels) in <top (required)>' Finished in 0.32876 seconds (files took 3.3 seconds to load) 4 examples, 1 failure Failed examples: rspec ./spec/models/user_spec.rb:22 # User#create passwordが存在してもpassword_confirmationがない場合は登録できないこと

該当のソースコード

user.rspec.rb

ruby

1require 'rails_helper' 2describe User do 3 describe '#create' do 4 5 it "email、password、password_confirmationが存在すれば登録できること" do 6 user = build(:user) 7 expect(user).to be_valid 8 end 9 10 it "emailがない場合は登録できないこと" do 11 user = build(:user, email: nil) 12 user.valid? 13 expect(user.errors[:email]).to include("を入力してください") 14 end 15 16 it "passwordがない場合は登録できないこと" do 17 user = build(:user, password: nil) 18 user.valid? 19 expect(user.errors[:password]).to include("を入力してください") 20 end 21 22 it "passwordが存在してもpassword_confirmationがない場合は登録できないこと" do 23 user = build(:user, password_confirmation: nil) 24 user.valid? 25 binding.pry 26 expect(user.errors[:password_confirmation]).to include("とパスワードの入力が一致しません") 27 end 28 end 29end

users.rb(factorybot)

ruby

1FactoryBot.define do 2 3 factory :user do 4 email {"kkk@gmail.com"} 5 password {"000000"} 6 password_confirmation {"000000"} 7 8 end 9end

model/user.rb

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 has_many :memos 7end

試したこと

binding.pryを用いたデバッグを行いました。
下記のようなコードになり、[:password_confirmation]が空欄であることは分かったのですが、何故空欄であるのかの原因を追求することができませんでした。

ターミナル

ruby

1 2 20: end 3 21: 4 22: it "passwordが存在してもpassword_confirmationがない場合は登録できないこと" do 5 23: user = build(:user, password_confirmation: nil) 6 24: user.valid? 7 => 25: binding.pry 8 26: expect(user.errors[:password_confirmation]).to include("とパスワードの入力が一致しません") 9 27: end 10 28: end 11 29: end 12 13[1] pry(#<RSpec::ExampleGroups::User::Create>)> user 14=> #<User id: nil, email: "kkk@gmail.com", created_at: nil, updated_at: nil> 15[2] pry(#<RSpec::ExampleGroups::User::Create>)> user.errors 16=> #<ActiveModel::Errors:0x00007f990140b0e0 @base=#<User id: nil, email: "kkk@gmail.com", created_at: nil, updated_at: nil>, @details={}, @messages={}> 17[3] pry(#<RSpec::ExampleGroups::User::Create>)> user.errors[:password_confirmation] 18=> [] 19[4] pry(#<RSpec::ExampleGroups::User::Create>)>

初歩的なミスかもしれませんが、どなたかご教示いただけますと助かります。
どうぞよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ruby 2.5.1p57
Rails 5.0.7.2

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

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

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

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

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

guest

回答2

0

自己解決

password_confirmationにvalidationが組まれてなかったため、
Userクラスに
validates :email,:password,:password_confirmation, presence: trueを加えて、
エクスペクテーションをexpect(user.errors[:password_confirmation]).to include("を入力してください")に変更した。

投稿2020/06/11 01:50

myxo

総合スコア2

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

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

0

Railsの初期設定ではpassword_confirmationnilの場合は
passwordと同一か?」を確認しません。
validates_confirmation_of

必要ならば
validates_presence_of :password_confirmation, if: :password_changed?をUserクラスに追加してください。

投稿2020/06/11 00:21

asm

総合スコア15147

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

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

myxo

2020/06/11 01:46

ご回答いただきましてありがとうございます。 アドバイスのコードでは、テストは通りませんでしたが、 参考ULRを元に、他にも自身で検索した結果、解決することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問