Railsのテスト(RSpec)をパスしたい
解決したいこと
RSpecで下記のテストがエラーになるのでパスしたい
it 'パスワードが存在すること' do
@user.password = ""
expect(@user).to be_invalid
end
事前にFactoryBotで@userにデータを挿入しています。
自分で試したこと
原因はuser.passwordに空の値を入れても反映されていない事です。
user.password_confirmationや他のカラムの場合は空の値が反映されています。
user.passwordに値を代入できない理由がわかりません泣
どなたかご教授お願いします😭
irb(main):030:0> user.password
=> "password"
irb(main):031:0> user.password = ""
=> ""
irb(main):032:0> user.password
=> "password"
irb(main):033:0>
補足
userモデルはこのようになっています。
create_table "users", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "name", null: false
t.string "email", null: false
t.string "password_digest"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
end
バリデーションは以下の通りです。※追記あり
#user.rb
has_secure_password
validates :name, presence: true, length: { maximum: 10 }
validates :email, presence: true, uniqueness: true
validates :password, presence: true, length: { in: 8..20 }
#検証のため追加
validates :password_confirmation, presence: true, length: { in: 8..20 }
factorybotで作成したデータです
FactoryBot.define do
factory :user do
name { "テストユーザ" }
email { "test@example.com" }
password { "password" }
password_confirmation { "password"}
coment { "テスト" }
end
end
使用状況はこのようになっています。
#user_spec.rb
略
before do
@user = FactoryBot.build(:user)
end
it 'パスワードが存在すること' do
@user[:password] = ""
expect(@user).to be_invalid
end
ちなみにこの他のカラムに関してのテストは正常にパスされています。
it '名前が存在すること' do
@user.name = ""
expect(@user).to be_invalid
end
it 'メールアドレスが存在すること' do
@user.email = ""
expect(@user).to be_invalid
end
it 'パスワード(確認)が存在すること' do
@user.password_confirmation = ""
expect(@user).to be_invalid
end
解決済み
結局なぜこの方法だと正常に動かないのかは突き止めることが出来ませんでしたが、目的であるテストをパスすることはできましたのでその方法を記載しておきます!
#user_spec.rb
略
before do
@user = FactoryBot.build(:user)
end
it 'パスワードが存在すること' do
@user = FactoryBot.build(:user, password: "")
expect(@user).to be_valid
end
テスト内でデータをオーバーライドしました!
インスタンス変数である必要は無いのですが、他のテストとの統一感を出すために@userという記述にしています。
コメントをくださった方々には大変感謝です!ありがとうございました!!🙇♂️