Railsでrspecのシンプルな例


はじめに

Railsでspecを書くときにこういう風に書いてという場合に、シンプルな例が欲しかったので書いてみました。

こんな感じ

  • itのなかはできるだけテストの対象のことだけを書く
  • contextで条件分けをする
  • contextのなかは、その文脈で差分が分かるようにする => let(:name)... の部分

対象のmodel

class User < ActiveRecord::Base
  validates :name, format: { with: /\A[^-][0-9A-Za-z-]+\z/, message: "英数字及びハイフン(-)のみが使えます" }
end

上に対するテストコード

require 'rails_helper'

RSpec.describe User, type: :model do
  describe 'validation about name rule' do
    let!(:user) { FactoryBot.build(:user, name: name) }

    context 'valid name' do
      let(:name) { 'mario-and-luige' }
      it 'return true' do
        expect(user.valid?).to be true
      end
    end

    context 'start with hiphen' do
      let(:name) { '-invalid-name' }
      it 'return false' do
        expect(user.valid?).to be false
      end
    end

    context 'include under score' do
      let(:name) { 'mario_luige' }
      it 'return false' do
        expect(user.valid?).to be false
      end
    end
  end
end

これだけが良い書き方ではない

rspecの書き方は、何をテストしているかわかりやすく書くことは大切ですが、
それに対してのやり方は割と好みがあるなと感じています。