かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

RSpec Rails Decorator で undefined method にハマる

やっはろー!RubyRailsもほぼ初心者マン即実戦で四苦八苦してる日々です。

ActiveDecorator が使われている Rails のプロジェクトで decorator のテストを RSpec で書いていた所、decorator にあるはずのメソッドが undefined method になりテストがコケてハマったのでメモ。

# frozen_string_literal: true
require 'rails_helper'

RSpec.describe IdolProfileDecorator do
  let(:profile) { create :idol_profile type: 1}
  describe '#type_to_text' do
    context 'when type is 1' do
      it 'returs "cute"' do
        expect(profile.type_to_text).to eq 'cute'
      end
    end
  end
end

Rails のアプリ側では ActiveDecorator で IdolProfile に自動的に IdolProfileDecorator が割り当てられて decorator の method が使えるようのですが、RSpec を走らせると undefined method 'type_to_text' ... メソッドがないよというエラーになってしまいまいました。

RSpec のテストファイルは自動的に decorator が割り当てられないっぽい?

ActiveDecorator::Decorator.instance.decorate(model_instance) で追加してあげたら RSpec で decorator のメソッドが使えるようになった。

RSpec.describe IdolProfileDecorator do
  let(:profile) { create :idol_profile type: 1}
  before { ActiveDecorator::Decorator.instance.decorate profile } # 追加
  describe '#type_to_text' do
    context 'when type is 1' do
      it 'returs "cute"' do
        expect(profile.type_to_text).to eq 'cute'
      end
    end
  end
end

active_decorator-rspec という gem を使うと RSpec でも自動的に decorator を割り当ててくれるっぽい。

とりあえずコレでテストは通るようになったけど、そもそも Decorator テストの書き方がこれで良いのか判断ができてない問題が残っている…
Railsのお決まりな作法を把握しきれてない & 初めてのRSpec & プロダクトの構成を把握してない。のトリプルコンボで挫けない強靭な精神を鍛える特訓になりました。

Rails 大きなプロダクトになると、たくさんの関連するファイルが別々の深い階層にあるの辛くない? (デキるエンジニア諸兄はターミナルから直接開くから気にならないのかな?


[参考]

ActiveDecorator

RSpec