🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
RSpec

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

Ruby on Rails

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

Q&A

解決済

1回答

1694閲覧

Rspecでの数値バリデーションのテストでActiveRecord::RecordInvalidエラーが発生する

begenner

総合スコア80

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/09/23 08:32

現在 Read Everyday Rails - RSpecによるRailsテスト入門 | Leanpub を参考にしながらテストコードを書いています。

モデルファイルで定義した数値バリデーションに対してfactory_botを利用して範囲外の数値テストをしようとしたところ
ActiveRecord::RecordInvalidエラー
でテストが失敗となり原因がわかりません。

RSpecではそもそもmodelで定義した数値オプションのバリデーションテストは必要なのか
という点も踏まえてわかるがいらっしゃれば教えていただきますようよろしくお願いいたします(m_ _m)

エラー内容

Failure/Error: review = FactoryBot.create(:review, score: 0) ActiveRecord::RecordInvalid: Validation failed: Score must be greater than or equal to 1

###期待する動作

  • modelで定義した数値オプションのバリデーションテストをパスしたい
  • (疑問) そもそもmodelで定義した数値オプションのバリデーションテストは必要なのか?

###動作環境
OS:mac
Ruby:2.4.5
Ruby on Rails: 4.2.11
rspec-rails: 3.6.1
factory_bot: 5.0.2

###該当のソースコード

ruby

1# app/models/review.rb 2class Review < ActiveRecord::Base 3 # validation 4 validates :score, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 5 } 5end 6 7# spec/factories/reviews.rb 8FactoryBot.define do 9 factory :review do 10 sequence(:score) { [*1..5].sample } 11 end 12end 13 14 15#spec/models/review_spec.rb 16require 'rails_helper' 17 18RSpec.describe Review, type: :model do 19 it "0" do 20 review = FactoryBot.create(:review, score: 0) 21 expect(review.errors[:score]).to include("Score must be greater than or equal to 1") 22 end 23end

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

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

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

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

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

siruku6

2019/09/23 08:37

自信がないのでこっちに書きます。 createに失敗すると、reviewには何も入らなかったような気がします。 review = FactoryBot.build(:review, score: 0) review.valid? expect(review.errors[:score]).to include("Score must be greater than or equal to 1") にしてみてはいかがでしょう? review = FactoryBot.build(:review, score: 0) expect(review.valid?).to be_falsey でもいいと思ってもいますが。
begenner

2019/09/23 08:45

早速のご返信ありがとうございます。 create を build に変更したところエラーメッセージが expected ["must be greater than or equal to 1"] to include "Score must be greater than or equal to 1" に代わりました。 それによってincludeに Score を記述していたことも原因のひとつであることがわかりました。 テストは1つめの回答に少し手を加えるだけでパスしました。 ありがとうございます!!
siruku6

2019/09/23 08:48

解決してよかったです! その解決策を回答欄に転記して、解決済みにしておきましょう。 (未解決だと思われて色々な人が見に来てしまうため)
begenner

2019/09/23 08:54

ありがとうございます!!
guest

回答1

0

自己解決

siruku6さんの助言のとおり

  • FactoryBot.createFactoryBot.buildに変更
  • expect構文のinclude内のScoreの記述を削除することでテストがパスするようになりました。

ruby

1#spec/models/review_spec.rb 2: 3# review = FactoryBot.create(:review, score: 0) 4review = FactoryBot.build(:review, score: 0) 5review.valid? 6# expect(review.errors[:score]).to include("Score must be greater than or equal to 1") 7expect(review.errors[:score]).to include("must be greater than or equal to 1") 8:

投稿2019/09/23 09:02

begenner

総合スコア80

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問