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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

RSpec

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

Ruby on Rails

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

Q&A

解決済

1回答

581閲覧

「RSpec」エラーになるはずのテストが通ってしまう現象

tarotarotarotar

総合スコア41

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/29 02:02

編集2020/10/29 02:17

質問させて頂きます。
現在ruby on railsにてテストコードを書いております。
エラーでは無いのですが、以下の現象が発生しました。
RSpecwo使ったuserモデルのテストコードです。(devise利用)

こちらが問題のテストコードです。
25行目でnicknameを空にしているので通常であればエラーとなるのですが、テストコードを正常に通過してしまいます。
【spec>models>user_spec.rb】

require

1describe User do 2 before do 3 @user = FactoryBot.build(:user) 4 end 5 6 describe 'ユーザー新規登録' do 7 context '新規登録がうまくいくとき' do 8 it "nicknameとemail、passwordとpassword_confirmationが存在すれば登録できる" do 9 expect(@user).to be_valid 10 end 11 it "nicknameが8文字以下で登録できる" do 12 @user.nickname = "aaaaaaaa" 13 expect(@user).to be_valid 14 end 15 it "passwordが6文字以上であれば登録できる" do 16 @user.password = "000000" 17 @user.password_confirmation = "000000" 18 expect(@user).to be_valid 19 end 20 end 21 22 context '新規登録がうまくいかないとき' do 23 it "nicknameが空だと登録できない" do 24 @user.nickname = '' 25 @user.valid? 26 end 27 it "nicknameが9文字以上であれば登録できない" do 28 @user.nickname = 'aaaaabccccccccccccccccbbb' 29 @user.valid? 30 end 31 end 32 end 33end 34コード

以下のように10行目でnicknameカラムにpresence: trueのバリデーションをかけているのですが、テストが正常に通過してしまいます。
【app>models>users.rb】

class

1 # Include default devise modules. Others available are: 2 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable 5 has_many :nutritions 6 has_many :favorites, dependent: :destroy 7 has_many :fav_nutritions, through: :favorites, source: :nutrition 8 9 validates :nickname, presence: true, length: { maximum: 8 } 10 11 def already_favorited?(nutrition, current_user) 12 Favorite.exists?(user_id: current_user.id, nutrition_id: nutrition.id) 13 end 14end 15 16コード

↓bundle exec rspec spec/models/user_spec.rbコマンドでテストしますがなぜか成功してしまいます。
イメージ説明

通常であればnicknameが空の時はエラーになると思うのですが何故なのでしょうか?
ローカル上でのブラウザでは正常にバリデーションがかかっております。(nisknameを空で登録しようとするとエラー文が返る)

ご教示頂けますと幸いです。

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

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

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

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

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

m.ts10806

2020/10/29 02:06

コードは画像では現象確認できませんので、原則テキストでマークダウンのcode機能にてご提示ください。 あと環境情報も詳細をご提示ください
tarotarotarotar

2020/10/29 02:10

失礼いたしました。 変更しました。
guest

回答1

0

ベストアンサー

テストコードを正常に通過してしまいます。

何もexpectしていないから、ということはありませんか?

投稿2020/10/29 02:05

maisumakun

総合スコア145183

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

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

tarotarotarotar

2020/10/29 02:12

コメントありがとうございます。 私の理解ではexpectは「任意のエラー文字をスルーさせる」という機能だと思っておりまして、 上記の状態は「エラーが発生しない」という状態なのでexpectしようがない状態です。 初学者なので勘違いでしたら申し訳ございません。 ご確認よろしくお願いいたします。
maisumakun

2020/10/29 02:12

itの中にexpectを書かなかった場合、中身が例外を起こさなければテストは成功となります。
maisumakun

2020/10/29 02:14

> expectは「任意のエラー文字をスルーさせる」という機能だと思っておりまして、 違います。「何が起きるべきか」を定義するための機能です。
tarotarotarotar

2020/10/29 02:24

ご教示頂きありがとうございます。 なかなか理解が出来ず大変申し訳ございません。 私の期待する動作としては マークダウン文中の @user.nickname = '' @user.valid? ではnicknameが空になるのでバリデーションに引っかかり、@user.valid?でエラーになり、そのエラー分をexpectで記載したいのですが、エラーになりません。 以前はこのやり方でエラーが表示され、それをexpectしていたのですが、挙動が変わっており戸惑っております。 説明がわかりづらく申し訳ございません。
maisumakun

2020/10/29 02:40 編集

> @user.valid?でエラーになり valid?は正しいかどうかをtrue/falseで返すだけで、基本的に例外は起こしません(起こすのは、モデルのコードが誤っている、もしくはよほど変な値を入れたような場合です)。
maisumakun

2020/10/29 02:37 編集

他のitでexpect(@user).to be_validのように書いていますが、validでないことを確認させたい場合は「expect(@user).not_to be_valid」とします。
tarotarotarotar

2020/10/29 02:41

>valid?は正しいかどうかをtrue/falseで返すだけで、基本的に例外は起こしません。 なるほどです! ここを理解しておりませんでした。 expect(@user).to be_valid とすることでエラー分を確認することが出来ました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問