rSpecでモデルスペックのバリデーションで、わざとバリデーション
で必須であるbodyをnil
として無効なテストデータにエラーが含まれるかチェックするテストで
そのデータに対してそもそもnil
が適用できないエラーでハマっています。
具体的には無効なbody
にエラーがあるかチェックするテストでvalidates :body, presence: true, length: { maximum: 500 }
として、テスト実行でエラーが起きてしまいます。
diary_spec.rb
ruby
1require 'rails_helper' 2 3RSpec.describe Diary, type: :model do 4 describe 'バリデーション' do 5 it '本文は必須であること' do 6 diary = build(:diary, body: nil) 7 diary.valid? 8 expect(diary.errors[:body]).to include('を入力してください') 9 end 10 end 11end
factories/diaries.rb
ruby
1FactoryBot.define do 2factory :diary do 3 body { Faker::Hacker.say_something_smart } 4 image { [File.open("#{Rails.root}/spec/fixtures/dummy.png")] } 5 user 6end 7end
diary.rb
ruby
1class Diary < ApplicationRecord 2 belongs_to :user 3 validates :body, presence: true, length: { maximum: 500 } 4 validates :check, length: { maximum: 200 } 5 validates :date_sequence, presence: true 6 mount_uploader :image, DiaryImageUploader 7 8 has_many :comments, dependent: :destroy 9 has_many :likes, dependent: :destroy 10 has_many :like_users, through: :likes, source: :user 11 12 scope :body_contain, ->(word){ where('diaries.body LIKE ?', "%#{word}%") } 13 scope :thumbnail, -> { where.not(image: nil).order(created_at: :desc).limit(10) } 14 scope :recent, ->(count) { order(created_at: :desc).limit(count)} 15 16 def user_diary_date 17 self.user.diary_date 18 end 19 20 def increment_diary_date 21 self.user.increment!(:diary_date) 22 end 23 24 def register_date_sequence 25 self.date_sequence = user_diary_date 26 end 27end
Failures:
- Diary バリデーション 本文は必須であること
Failure/Error: diary = build(:diary, body: nil)
TypeError:
no implicit conversion of nil into String
./spec/models/diary_spec.rb:6:in `block (3 levels) in <top (required)>'
以下のバリデーションも試してみましたが同じ内容でした。
ruby
1validates :body, length: { maximum: 500 }, allow_blank: true 2 validates :body, presence: true
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。