#実現したいこと
親モデルのuser
は子モデルhabit
を複数登録できる 1対多の関係です。
そこでuser
はhabit
モデルを6つまでしか登録できないという独自のバリデーションを加え,そのテストを書いています。
先にhabit
モデルを6つ生成して
create_list(:habit, 6, user: user)
7つ目を登録しようとするとfalseになる
expect(build(:habit, task: "筋トレ", user: user).save).to be_falsey
と言うふうにしたいのですが7つ目もtrueとなってしまいます。
consoleで確認するとちゃんとバリデーションエラーになります。
わかる方いましたらぜひ知恵を貸して頂きたいです。
よろしくお願い致しますm(__)m
#エラーメッセージ
Failure/Error: expect(build(:habit, task: "筋トレ", user: user).save).to be_falsey expected: falsey value got: true
habit.rb
class Habit < ApplicationRecord belongs_to :user validates :task, presence: true, length: { maximum: 12 }, uniqueness: { scope: :user } validates :frequency, presence: true validate :user_habits_size_validate HABIT_MAX = 6 def user_habits_size_validate if self.user && self.user.habits.size >= HABIT_MAX errors.add(:task,"は#{HABIT_MAX}つまでしか登録出来ません") end end end
habits.rb(FactroyBot)
FactoryBot.define do factory :habit do sequence(:task) { |n| "ランニング#{n}"} frequency { 3 } user end end
habit_spec.rb
require 'rails_helper' RSpec.describe Habit, type: :model do let(:user){ create(:user) } let(:habit) { create(:habit) } # given!(:habits) { 6.time.collect { |n| create(:habit, task: "ランニング#{n}")}} describe 'バリデーション' do it 'taskが空の場合は保存できない' do habit.task = "" expect(habit).to_not be_valid end it 'taskが12文字以上の場合保存できない' do habit.task = "a" * 13 expect(habit).to_not be_valid end it 'userは同じtaskカラムを持つhabitモデルを保存できない' do expect(build(:habit, task: "ランニング", user: user).save).to be_truthy expect(build(:habit, task: "ランニング", user: user).save).to be_falsey end it 'userはhabitモデルを6つ以上持てない' do #エラーになるテスト create_list(:habit, 6, user: user) expect(build(:habit, task: "筋トレ", user: user).save).to be_falsey end it "frequencyがnilの場合は保存できない" do habit.frequency = nil expect(habit).to_not be_valid end end end
habit
を6つ登録するところまではできてると思います。
22: it 'userはhabitモデルを6つ以上持てない' do 23: habits = create_list(:habit, 6, user: user) => 24: binding.pry 25: expect(build(:habit, task: "筋トレ", user: user).save).to be_falsey 26: end 27: it "frequencyがnilの場合は保存できない" do 28: habit.frequency = nil 29: expect(habit).to_not be_valid [1] pry(#<RSpec::ExampleGroups::Habit::Nested>)> habits => [#<Habit:0x000055ede6be1f20 id: 1, task: "ランニング3", frequency: 3, user_id: 1, created_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, updated_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, end_time: nil, complete: 0>, #<Habit:0x000055ede6beece8 id: 2, task: "ランニング4", frequency: 3, user_id: 1, created_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, updated_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, end_time: nil, complete: 0>, #<Habit:0x000055ede6c0a498 id: 3, task: "ランニング5", frequency: 3, user_id: 1, created_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, updated_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, end_time: nil, complete: 0>, #<Habit:0x000055ede6bfdc70 id: 4, task: "ランニング6", frequency: 3, user_id: 1, created_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, updated_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, end_time: nil, complete: 0>, #<Habit:0x000055ede6c11428 id: 5, task: "ランニング7", frequency: 3, user_id: 1, created_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, updated_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, end_time: nil, complete: 0>, #<Habit:0x000055ede6c1cbc0 id: 6, task: "ランニング8", frequency: 3, user_id: 1, created_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, updated_at: Sun, 06 Dec 2020 23:40:44 JST +09:00, end_time: nil, complete: 0>]
#バージョン
Rails 6.0.3.4
ruby 2.6.3p62
RSpec 3.10
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/07 09:06
2020/12/07 09:17
2020/12/07 09:26