LoginSignup
1
0

More than 1 year has passed since last update.

バリデーションで投稿文字数を制限した時に単体テストコードを完結に記述する方法

Posted at

はじめに

口コミサイト作成中、感想が長すぎてもよろしくないと思ったので140文字以上は投稿できなくするバリデーションをかけました。

しかしテストコードで異常系を記述する時140文字も書くの大変じゃん!と思ってしまいしました。

この記述をなんとか短くできないかを考えたので投稿させて頂きます。

バリデーションを定義する

model.rb
class Model < ApplicationRecord

validates :text, length: { maximum: 140 }

end

これでtextに140文字以上の文字数は投稿に失敗します。

単体テストコードを記述する

正常系でも投稿できるか検証するためFactoryBotとFakerを使いました。

spec>factories>model.rb
FactoryBot.define do
  factory :review do
   text {Faker::Lorem.sentence}
  end
end

こうする事でランダムで文章が作られます。

[1] pry(main)> Faker::Lorem.sentence
=> "みなと漠然運ぶはじめて。"

[2] pry(main)> Faker::Lorem.sentence
=> "かちゅう金じきしょうそう見当たる。"

これでは140文字もできないので自ら書かなけらばなりません。

model_spec.rb
  describe '投稿機能' do

   context '投稿できるとき' do
    #省略
   end

   context '投稿が失敗するとき' do
    it 'textが140文字以上だと投稿できない' do
      @model.text = 'テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。テストで140文字書いています。
      @model.valid?
      expect(@model.errors.full_messages).to include('感想は140文字以内で入力してください')
    end
  end

最初はこのように140文字びっしり書いてましたがあまり良くないなと思いました。

正しい書き方かは分かりませんが下記のように書いたらコンパクトに書くことができました。

model_spec.rb
 it 'textが140文字以上だと投稿できない' do
   @model.text = `テストです` * 140
   @model.valid?
   expect(@model.errors.full_messages).to include('感想は140文字以内で入力してください')
 end

この記述でテストですという5文字に140を掛け算して140文字以上の記述をすることができました。

最後に

この方法が正しいかは分かりません。。。
もっと簡潔な記述方法があれば教えて下さい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0