#はじめに
口コミサイト作成中、感想が長すぎてもよろしくないと思ったので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文字以上の記述をすることができました。
#最後に
この方法が正しいかは分かりません。。。
もっと簡潔な記述方法があれば教えて下さい。