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

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

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

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

モデルに追記したパスワードの正規表現がマッチせず、factoryBotとrspecのテストに失敗する。

gomes_2222
gomes_2222

総合スコア88

RSpec

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

1回答

0グッド

0クリップ

253閲覧

投稿2023/02/17 05:25

実現したいこと

会員登録機能を作成中。
必要情報のうち、パスワードにバリデーションを実装し、rspecの単体テストを通したい。

前提

パスワードに、文字数は8~100字
半角英数字のみ使用可能。(アルファベットと数字両方盛り込む)
という条件のバリデーションを実装してますがうまくいきません。

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

とりあえず、nameカラムのバリデーションテストだけ書いてrspecを動かすと以下のエラーがでてテスト失敗します。
意味としては、テストを実施するためにテストデータを登録しようとしたが、バリデーションに引っかかってエラーとなり、テストデータを用意できずということと思います。
バリデーションの書き方に問題ありのようですが、自分ではわかりませんでした。
見ていただきたいです。

Encrypted password is invalid

該当のソースコード

user.rb

1 2class User < ActiveRecord::Base 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable 5 6 include DeviseTokenAuth::Concerns::User 7 8 validates :name, 9 presence: true, 10 length: { maximum: 100 } 11 12 VALID_PASSWORD = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 13 validates :encrypted_password , 14 presence: true, 15 uniqueness: true, 16 length: { in: 8..100 }, 17 format: { with: VALID_PASSWORD }, 18 confirmation: true 19end

user_rspec

1require ‘rails_helper’ 2RSpec.describe User, type: :model do 3 describe “validation user” do 4 it ‘nameが空の場合、無効である’ do 5 user = FactoryBot.build(:user, name: nil) 6 user.valid? 7 expect(user.errors[:name]).to include(“can’t be blank”) 8 end 9 end 10end

factoryBot

1FactoryBot.define do 2 factory :user do 3 name { ‘test_user’ } 4 sequence(:email) { |n| “test_#{n}@test.com”} 5 password { ‘testpass00’ } 6 end 7end

試したこと

色々正規表現を試したりしましたが、状況変わらず。
多分、正規表現やどこかの書き方がまちがってると思うのですが、何がダメなんでしょうか?
正規表現の箇所をコメントアウトするとテスト通るので着眼点はほぼ間違いないとは思ってます。

ただテスト用パスワード文字列と正規表現がマッチするかRubularで試したら問題ないなかったので、困ってます。
それとも、deviseのデフォルトのバリデーション設定が悪さしてるとかでしょうか?
パスワードについては文字数しかバリデーションかかってないと資料で見たので、競合はしてないはずなんですが・・

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

rails
rspec

devise
factorybot

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

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

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

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

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

encrypted_passwordは、書いての通り暗号化後※のパスワードです。

それに対してバリデーションをかけても、「暗号化後の結果が特定の形になるパスワードしか打ち込めない」という、まったく実用に値しないバリデーションにしかならず、有害無益です。


※ 暗号化というと多少語弊がありますが、とりあえず「元のパスワードとは全く別の文字列」となっています。

投稿2023/02/17 06:27

maisumakun

総合スコア143020

yuma.inaura👍を押しています

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

maisumakun

2023/02/17 06:30 編集

そもそも論としては、自前でハッシュ化して格納するパスワードに対して「記号を禁止する必要があるのか」という問題もあります。 https://teratail.com/questions/38661
gomes_2222

2023/02/17 07:51

ありがとうございました。 全く見当違いなことをしてました。 項目名をpasswordにすることで理想通りの動きになりました。ありがとうございました。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.83%

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

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

質問する

関連した質問

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

RSpec

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。