Q&A
実現したいこと
会員登録機能を作成中。
必要情報のうち、パスワードにバリデーションを実装し、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件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/02/17 06:30 編集
2023/02/17 07:51