Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

【RSpec】shoulda-matchersでenum,delegateのテスト

shoulda matchers

shoulda-matchersはvalidationやassociationのテストを超簡単に書ける便利マッチャ集みたいなgem.

example

class User < ActiveRecord::Base
  belongs_to :company
  has_one :profile

  delegate :name, to: :profile
  delegate :name, to: :company, prefix: true
end

class Profile < ActiveRecord::Base
  belongs_to :user

  enum gender: %i(male female)
end

class Company < ActiveRecord::Base
  has_many :users
end

enum

define_enum_forを利用する.

describe Profile do
  describe 'enums' do
    it { is_expected.to define_enum_for(:male, :female)
  end
end

delegate

delegate_methodを利用する.

describe User do
  describe 'delegations' do
    it { is_expected.to delegate_method(:name).to(:profile) }
    it { is_expected.to delegate_method(:name).to(:company).with_prefix }
  end
end

そもそも必要なのか?

Railsにおいては,mvalidationやassociation,delegation,enumなどの定義はDSL的に宣言するだけである. それをわざわざテストを行う必要があるのか,という疑問は常に発生する(気がする).

まあ普通はいらんやろ,っていうのが正直な感想. これらのテストが必要とされる場面あるのかなー って考えた時に思いついたのが以下の2つ.

  • カバレッジが下がるのが腹立つ
    • Coverallsなどでバッジ貼ってる場合は特に
  • RSpec仕様書として使う(spec n. 仕様書
    • コード本体じゃなく記述されたテスト見て仕様把握するタイプの人間がいる場合とか?

ぼく個人としては前者. はじめて自projectでバッジ貼ったらテンション上がるし, どうせならかっこいいまま保ちたいやん? (そこでカバレッジやコードの質(Code Climate)にこだわりすぎると元も子もないが….)

と,いうことでぼくはshoulda-matchersで最小限だけのテストは書くようにしてます.