ActiveDecoratorのRspecの書き方

こんにちは!kossyです!




さて、今回はDecoratorのRspecでのテストの書き方の例について、
ブログに残してみたいと思います。




環境
Rails 5.2.3
Ruby 2.6.3
draper 3.1.0
MacOS Mojave




書き方
とりあえずDecoratorのコードを載せます。

class MemberDecorator < Draper::Decorator

  delegate_all

  def show_sex
    sex == 'male' ? '' : ''
  end

  def administrate_display
    administrator == true  ? '' : ''
  end

  def show_birthday
    birthday&.strftime('%Y年%m月%d日')
  end

  def age
    date = Date.today
    ((date.strftime('%Y%m%d').to_i - birthday.strftime('%Y%m%d').to_i) / 10000).to_s + ''
  end

end

上記のコードのテストを書いてみます。

require 'rails_helper'

RSpec.describe MemberDecorator, type: :decorator do
  describe 'MemberDecoratorに定義したメソッドが正しく動作すること' do
    describe 'show_sex' do
      describe 'sexがmaleの場合' do
        let(:member) { create :member, sex: :male }
        subject { member.decorate }

        it '男と表示される' do
          expect(subject.show_sex).to eq ''
        end
      end

      describe 'sexがfemaleの場合' do
        let(:member) { create :member, sex: :female }
        subject { member.decorate }

        it '女と表示される' do
          expect(subject.show_sex).to eq ''
        end
      end
    end

    describe 'administrate_display' do
      describe 'administratorがtrueの場合' do
        let(:member) { create :member, administrator: true }
        subject { member.decorate }

        it '○と表示される' do
          expect(subject.administrate_display).to eq ''
        end
      end

      describe 'administratorがfalseの場合' do
        let(:member) { create :member, administrator: false }
        subject { member.decorate }

        it '-と表示される' do
          expect(subject.administrate_display).to eq ''
        end
      end
    end

    describe 'show_birthday' do
      let(:member) { create :member }
      subject { member.decorate }

      it '%Y年%m月%d日と表示される' do
        expect(subject.show_birthday).to have_content ''
      end
    end

    describe 'age' do
      let(:member) { create :member }
      subject { member.decorate }

      it '年齢が表示される' do
        expect(subject.age).to have_content ''
      end
    end
  end
end


subjectを使ってテスト対象をモック化して、
decorateメソッドでdecoratorに定義したメソッドを使えるようにしています。


おおむねこんな感じで書けばいいんじゃないでしょうか(適当)