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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

1回答

1744閲覧

単体テストで特定の構文のみを出現させたい

Solt24times

総合スコア32

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2021/12/02 12:32

前提・実現したいこと

フリマアプリのモデルの単体テストをしているのですが特定の文だけを出すためのコードに悩んでいます。

発生している問題・エラーメッセージ

単体テストで「価格が空の場合登録できない」というバリデーションエラーの構文を書きたいのですが、他にもバリデーションが複数かかっている為、同時に複数のエラーメッセージが出てきてしまいテストが成功しない状態です。
色々と参考になる場所を見てはいるのですが上手くいきません。
ターミナル

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

すみません、どうやら勘違いして覚えていたようです。
特定の構文を書き出すのではなく、出てきた構文全てを打ち込めばいいだけのようでした!

投稿2022/01/23 06:53

Solt24times

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問