#実現したいこと
親モデルのuser
がhabit
という子モデルを複数持っています。
habit
にはtask
というカラムがあり、user
は、habit
モデルは複数持てるが、task
カラムの重複は許さないというようなテストを書いています。
そこでFactroyBotで同じtask
カラムを持つhabit
モデルを2つ用意し、1つ目は保存が成功するが2つ目は失敗するというテストを書きたいのですが同じuser
を2回作成しようとしてしまうためかメールアドレスは既に存在しますというuser
のバリデーションエラーになってしまいます。
自分なりに調べてみましたが、上手くいくやり方が中々見つかりませんでした。
わかる方いましたらぜひ知恵を貸していただけると幸いです。
よろしくお願いしますm(__)m
#エラーメッセージ
1) Habit バリデーション userは同じtaskカラムを持つhabitモデルを保存できない Failure/Error: let(:habit2) { create(:habit2) } ActiveRecord::RecordInvalid: バリデーションに失敗しました: メールアドレスはすでに存在します
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
FactoryBot
FactoryBot.define do factory :habit do task {"ランニング"} frequency { 3 } user end factory :habit2, class: Habit do task {"ランニング"} frequency { 2 } user end end
habit_spec.rb
require 'rails_helper' RSpec.describe Habit, type: :model do let(:habit) { create(:habit) } let(:habit2) { create(:habit2) } 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(habit.save).to be_truthy expect(habit2.save).to be_falsey end it "frequencyがnilの場合は保存できない" do habit.frequency = nil expect(habit).to_not be_valid end end end
#バージョン
Rails 6.0.3.4
ruby 2.6.3p62
RSpec 3.10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/05 08:25
2020/12/05 08:46 編集
2020/12/05 09:06