前提
プロフィール作成フォームにて、user_name
が空欄で入力されたときに、
バリデーションがかかり、「user_nameが空欄の時、登録できないこと」のテストが通るようにしたい
のテストを実装したいがタイトルの通り、Couldn't find User with 'id'
エラーが発生しテストが通りません。
実現したいこと
「user_nameが空欄の時、登録できないこと」のテストが通るようにしたい
発生している問題・エラーメッセージ
Failure/Error: expect(user.reload.user_name).to be_invalid ActiveRecord::RecordNotFound: Couldn't find User with 'id'=9 # /usr/local/bundle/gems/activestorage-7.0.4/lib/active_storage/attached/model.rb:237:in `reload' # ./spec/models/user_spec.rb:33:in `block (3 levels) in <main>'
該当のソースコード
user_spec.rb
require 'rails_helper' RSpec.describe User, type: :model do describe 'ユーザー登録' do it 'email,passwordが存在すれば登録出来ること' do user = build(:user) expect(user).to be_valid end it 'emailが空欄の時、登録できないこと' do user = build(:user) user.email = '' expect(user).to be_invalid end it 'passwordが空欄の時、登録できないこと' do user = build(:user) user.password = '' expect(user).to be_invalid end end describe 'プロフィール登録' do it 'user_nameが存在すれば登録出来ること' do user = build(:user) expect(user).to be_valid end it 'user_nameが空欄の時、登録できないこと' do <-----------問題のコード user = build(:user) user.user_name = '' expect(user.reload.user_name).to be_invalid end end end
spec/factories/users.rb
FactoryBot.define do factory :user do sequence(:id) { |n| n} sequence(:email) { |n| "person#{n}@example.com" } password { "123456" } user_name { "test" } self_introduce { "test" } end end
app/controllers/home_controller.rb
class HomeController < ApplicationController def top @q = User.ransack(params[:q]) @services = Service.all end def profile @user = current_user end def update @user = current_user if @user.update(params.permit(:profile_image, :user_name, :self_introduce, :twitter_url, :youtube_url, :instagram_url)) flash[:notice] = "Profile was successfully updated." redirect_to "/" else render 'profile', status: :unprocessable_entity end end def show @user = User.find(params[:id]) @user_movies = @user.movies @services = @user.services end def search @q = User.ransack(params[:q]) @results = @q.result end end
app/models/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_one_attached :profile_image has_many :services, dependent: :destroy has_many :movies, dependent: :destroy #プロフィール画面でのみバリデーションがかかるように validates :user_name, presence: true, on: :update end
補足
rails 7
ruby3.1.1
よろしくお願いします。
0 コメント