前提・実現したいこと
フリマアプリのモデルの単体テストをしているのですが特定の文だけを出すためのコードに悩んでいます。
発生している問題・エラーメッセージ
単体テストで「価格が空の場合登録できない」というバリデーションエラーの構文を書きたいのですが、他にもバリデーションが複数かかっている為、同時に複数のエラーメッセージが出てきてしまいテストが成功しない状態です。
色々と参考になる場所を見てはいるのですが上手くいきません。
ターミナル
63: end 64: 65: it '価格が空の場合登録されない' do 66: @item.price = " " 67: @item.valid? => 68: binding.pry 69: 70: end 71: 72: it '価格は半角数値で入力されていない場合登録できない' do 73: @item.price = "2000" [1] pry(#<RSpec::ExampleGroups::Item::Nested::Nested_2>)> @item.errors.full_messages => ["Price can't be blank", "Price is invalid", "Price is not a number"] [2] pry(#<RSpec::ExampleGroups::Item::Nested::Nested_2>)>
上記の内容でPrice can't be blank
の部分だけ抜き出して表示して欲しいです。
該当のソースコード
spec/model/item_spec.rb
ruby
1require 'rails_helper' 2 3RSpec.describe Item, type: :model do 4 5 before do 6 @item = FactoryBot.build(:item) 7 end 8 9 describe '商品出品機能' do 10 context '商品の出品が正しく行われる場合' do 11 it '全ての情報が正しく打ち込まれていると登録できる' do 12 expect(@item).to be_valid 13 end 14 end 15 16 context '商品の出品が正しく行われない場合' do 17 it '商品画像が添付されていなければ登録されない' do 18 @item.image = nil 19 @item.valid? 20 expect(@item.errors.full_messages).to include("Image can't be blank") 21 end 22 23 it '商品名が空の場合登録されない' do 24 @item.item_name = "" 25 @item.valid? 26 expect(@item.errors.full_messages).to include("Item name can't be blank") 27 end 28 29 it '商品説明が空の場合登録されない' do 30 @item.item_text = "" 31 @item.valid? 32 expect(@item.errors.full_messages).to include("Item text can't be blank") 33 end 34 35 it 'カテゴリーが空の場合登録されない' do 36 @item.category = nil 37 @item.valid? 38 expect(@item.errors.full_messages).to include("Category can't be balnk") 39 end 40 41 it '商品の状態が空の場合登録されない' do 42 @item.status = nil 43 @item.valid? 44 expect(@item.errors.full_messages).to include("Status can't be balnk") 45 end 46 47 it '配送料の負担が空の場合登録されない' do 48 @item.delivery_fee = nil 49 @item.valid? 50 expect(@item.errors.full_messages).to include("Delivery fee can't be balnk") 51 end 52 53 it '発送元が空の場合登録されない' do 54 @item.prefectures = nil 55 @item.valid? 56 expect(@item.errors.full_messages).to include("Prefectures can't be balnk") 57 end 58 59 it '発送までの日数が空の場合登録されない' do 60 @item.shipping_date = nil 61 @item.valid? 62 expect(@item.errors.full_messages).to include("Shipping date can't be balnk") 63 end 64 65 it '価格が空の場合登録されない' do ←特定の構文を出したい場所 66 @item.price = " " 67 @item.valid? 68 binding.pry 69 70 end 71 72 it '価格は半角数値で入力されていない場合登録できない' do 73 @item.price = "2000" 74 @item.valid? 75 expect(@item.errors.full_messages).to include("Price is not a number") 76 end 77 78 it '価格が300円以下の場合登録されない' do 79 @item.price = 299 80 @item.valid? 81 expect(@item.errors.full_messages).to include("Price must be greater than or equal to 300") 82 end 83 it '価格が9999999円以上の場合登録されない' do 84 @item.price = 10000000 85 @item.valid? 86 expect(@item.errors.full_messages).to include("Price must be less than or equal to 9999999") 87 end 88 end 89 end 90end 91 92
spec/factory/item.rb
ruby
1FactoryBot.define do 2 factory :item do 3 item_name { Faker::Name.initials(number: 2) } 4 item_text { Faker::Lorem.sentence } 5 price {Faker::Number.between(from: 300, to: 9_999_999)} 6 category_id {Faker::Number.between(from: 2, to: 11)} 7 delivery_fee_id {Faker::Number.between(from: 2, to: 3)} 8 prefectures_id {Faker::Number.between(from: 2, to: 48)} 9 shipping_date_id {Faker::Number.between(from: 2, to: 4)} 10 status_id {Faker::Number.between(from: 2, to: 7)} 11 12 association :user 13 14 after(:build) do |item| 15 item.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png') 16 end 17 end 18end
model/item.rb
ruby
1class Item < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 4 belongs_to :category 5 belongs_to :delivery_fee 6 belongs_to :prefectures 7 belongs_to :shipping_date 8 belongs_to :status 9 belongs_to :user 10 has_one_attached :image 11 12 validates :item_name, :item_text, :price, :image, presence: true 13 validates :price, format: { with: /\A[0-9]+\z/ } 14 validates :price, numericality:{only_integer: true, greater_than_or_equal_to: 300, less_than_or_equal_to: 9999999 } 15 validates :category_id, :status_id, :delivery_fee_id, :prefectures_id, :shipping_date_id, numericality: { other_than: 1, message: "can't be balnk"} 16 17end 18
試したこと
上記でも書いた通りいくつかの記事を参考に色々と試したのですがダメでした。
何かいい書き方があればご指導いただければと思います。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。