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

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

ただいまの
回答率

87.49%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,074

score 2

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

解決したいテスト内容: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

require 'rails_helper'
describe User do
  describe '#create' do

    it "email、password、password_confirmationが存在すれば登録できること" do
      user = build(:user)
      expect(user).to be_valid
    end

    it "emailがない場合は登録できないこと" do
      user = build(:user, email: nil)
      user.valid?
      expect(user.errors[:email]).to include("を入力してください")
    end

    it "passwordがない場合は登録できないこと" do
      user = build(:user, password: nil)
      user.valid?
      expect(user.errors[:password]).to include("を入力してください")
    end

    it "passwordが存在してもpassword_confirmationがない場合は登録できないこと" do
      user = build(:user, password_confirmation: nil)
      user.valid?
      binding.pry
      expect(user.errors[:password_confirmation]).to include("とパスワードの入力が一致しません")
    end
  end
end

users.rb(factorybot)

FactoryBot.define do

  factory :user do
    email                 {"kkk@gmail.com"}
    password              {"000000"}
    password_confirmation {"000000"}

  end
end

model/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
  has_many :memos
end

試したこと

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

ターミナル

    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
    29: end

[1] pry(#<RSpec::ExampleGroups::User::Create>)> user
=> #<User id: nil, email: "kkk@gmail.com", created_at: nil, updated_at: nil>
[2] pry(#<RSpec::ExampleGroups::User::Create>)> user.errors
=> #<ActiveModel::Errors:0x00007f990140b0e0 @base=#<User id: nil, email: "kkk@gmail.com", created_at: nil, updated_at: nil>, @details={}, @messages={}>
[3] pry(#<RSpec::ExampleGroups::User::Create>)> user.errors[:password_confirmation]
=> []
[4] pry(#<RSpec::ExampleGroups::User::Create>)> 

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

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

ruby 2.5.1p57
Rails 5.0.7.2

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/11 10:46

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る