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

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

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

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

RSpec

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

Ruby on Rails

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

Q&A

解決済

2回答

2866閲覧

Rspec ユーザー登録時の文字制限のテストの書き方

muraishi

総合スコア17

Ruby

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

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/02/20 02:19

編集2020/02/20 07:20

ユーザーの文字制限のテストを書きたいのですが、うまくいきません。
よろしくお願いいたします!

Rspec

1 it "ユーザー名が51文字以上の場合は登録できない、かつ、50文字の場合は登録できる" do 2 user = User.new(name: "a" * 51, password: "password") 3 expect{ user.name.delete("a") }.to change{ user }.from( false ).to( user.save ) 4 end

model

1class User < ApplicationRecord 2 has_many :timetables, dependent: :destroy 3 validates :name, presence: true, length: { maximum: 50 } 4 has_secure_password 5 validates :password, presence: true, length: { minimum: 6 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

ActiveRecordのバリデーションのテストを書くかどうかはおいておいて、書き方の例を回答します。
(個人的にはRSpecの勉強のために書くのは全然ありだと思います)

AvtiveRecord のinvalid?メソッドを使うとこのようにかけます。
Active Record バリデーション - Railsガイド

rb

1it "ユーザー名が51文字以上の場合は登録できない" do 2 user = User.new(name: "a" * 51, password: "password") 3 expect(user.invalid?).to be true 4end

または、RSpecのbe_invalid?マッチャーを使ってもかけると思います。

rb

1it "ユーザー名が51文字以上の場合は登録できない" do 2 user = User.new(name: "a" * 51, password: "password") 3 expect(user).to be_invalid 4end

どちらでもご自身がリーダブルだと思う方でいいと思います。

RSpecの書き方については、こちらの記事が情報がまとまっていてわかりやすかったです。

投稿2020/02/20 05:21

shgtkshruch

総合スコア665

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

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

muraishi

2020/02/20 07:19

ご回答ありがとうございます! そうなんですよ!まさにこのキータの記事をみながら勉強始めたんです! invalid?っていうメソッドもあるんですね!今までvalidだけをつかって、not_toでテスト書いてました。 質問を追加して本当に申し訳ないのですが、 実は私も最初はshgtkshruchさんが教えてくださった、この方法でやったのですが(もちろんパスしました)、テストを書いた後に気づいたんです。このテストは51文字以上名前を入力した時、ユーザー登録できないことはテストできているのですが、50文字入力した時にユーザー登録が成功することはテストできていないので、また50文字打った場合の別のテストを書いても良いのですが、なんとか一つのテストで51文字の場合と50文字の場合を同時にテストできればと思い it "ユーザー名が51文字以上の場合は登録できない" do user = User.new(name: "a" * 51, password: "password") expect{ user.name.delete("a") }.to change{ user }.from( false ).to( user.save ) end こういう形になりました。こんな感じでなんとかテストを書くことってできないでしょうか? (itを"ユーザー名が51文字以上の場合は登録できない、かつ50文字の時は登録できる"とするべきでした。すみません!) ※ちなみに、このchangeメソッドを使ったのは 使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」 - Qiitaで、 expect{ X }.to change{ Y }.from(A).to(B) = 「X すると Y が A から B に変わることを期待する」 という一文を自分なりに当てはめて書いてみました!
maisumakun

2020/02/20 07:23

> なんとか一つのテストで51文字の場合と50文字の場合を同時にテストできれば テストは単純にしたほうがいいです。変化したときに動作するか確認する目的のテストでないなら、「51文字で引っかかる」「50文字で引っかからない」ことを別途で検証することをおすすめします。
muraishi

2020/02/20 08:06

わかりました。テストは簡潔にします。伊藤さんのキータでも、「さて、モックやRSpec Railsなどの特殊な用途のマッチャを除けば、ここまでに紹介したマッチャで標準的なテストはほとんどカバーできると思います。」と書いてあったのですね!
shgtkshruch

2020/02/20 10:37

maisumakunさんが書いているように、テストは分けたほうがいいと思います。 各テストで確認するべきことは(関心事)は1つにする、シンプルにするのがいいと思います。 そのほうが失敗した場合にエラーが探しやすくなりますし、コードも読みやすい事が多いです。 RSpecの書き方はこちらのようなガイドラインがあります。 これが正解ではないですが、一つの指針として参考になると思います。 http://www.betterspecs.org/jp/
muraishi

2020/02/20 14:57

はいテストは分けるようにします。なるほど、エラーを特定する時のために簡潔にしておくのがベストなんですね! ガイドラインを教えていただきありがとうございます! よんでみます!
guest

0

そもそも論として、そのようなテストは必要なのでしょうか。

バリデーションを自作するとか、複数の制約の兼ね合いを検証しなければならないのなら別ですが、Rails組み込みのvalidates length:を使うだけの制約を、さらにテストコードで検証するというのは、少し過剰なようにも思えます。

投稿2020/02/20 02:50

maisumakun

総合スコア146018

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

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

muraishi

2020/02/20 02:57

ご回答ありがとうございます。 そうなんですね!過剰なんですね! RSpecを勉強したてで、練習のつもりで小さいコードを書いていたのですが、、、 独学だとRailsの一般常識が把握しづらいので、変なことを質問しがちですが、許してください。 ありがとうございます
maisumakun

2020/02/20 07:26

> RSpecを勉強したてで、練習のつもりで小さいコードを書いていたのですが、、、 Rspec自体の練習だったのですね、それは失礼しました。
muraishi

2020/02/20 08:03

いえいえ、テストの規模が小さすぎるのは省いても良いことを教えてくださりありがとうございます。これからもよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問