質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1662閲覧

Rspecで属性がnilで無効であるテストでエラーになってしまう

JuniorSirius

総合スコア38

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/11/27 03:20

編集2021/11/27 03:40

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:

  1. 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

image { [File.open("#{Rails.root}/spec/fixtures/dummy.png")] }
が配列でおかしかったみたいです。

投稿2021/11/27 04:14

JuniorSirius

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問