やっはろー!RubyもRailsもほぼ初心者マン即実戦で四苦八苦してる日々です。
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 大きなプロダクトになると、たくさんの関連するファイルが別々の深い階層にあるの辛くない? (デキるエンジニア諸兄はターミナルから直接開くから気にならないのかな?
[参考]
- ruby on rails - メソッドをhelperからdecoratorに移動すると undefined method `term' のエラーが発生する - スタック・オーバーフロー
- GitHub - amatsuda/active_decorator: ORM agnostic truly Object-Oriented view helper for Rails 3, 4, 5, and 6
ActiveDecorator
- Ruby on Rails のテストフレームワーク RSpec 事始め - Qiita
- 使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」 - Qiita
- Rspecの文法の基礎 - Qiita
- RSpecチートシート - Qiita
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者: Sandi Metz,?山泰基
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/02
- メディア: 大型本
- この商品を含むブログ (6件) を見る