active_decoratorにてデコレートされたモデルをrspecでテストする際、デコレータ内でヘルパーメソッド(link_to
とかurl_for
とか)を使用しているとNoMethodErrorが発生する。これはActiveDecorator::ViewContext
にActionView::Context
が積まれてないことが原因みたい。rspec専用のgem(mizoR/active_decorator-rspec)もあるみたいだけど、まだrails 5には対応できてない((active_decorator-rspec 0.0.9で対応したようです。))(もしくはrspec 3.5?)ようなので、対応策をメモっておく。
環境
- rails 5.0.0.rc1
- rspec 3.5.0.beta3
- active_decorator 0.7.1
対応方法
まずはrspecようのヘルパーモジュールを書く。私の場合はsupportディレクトリ内に置いて読みこむようにしてるので、spec/support/decorator_spec_helper.rb
に書く。
📄spec/support/decorator_spec_helper.rb
module DecoratorSpecHelper def self.included(base) base.class_eval do before do controller = ApplicationController.new controller.request = ActionDispatch::TestRequest.create ActiveDecorator::ViewContext.push controller.view_context end end end end
テスト用のコントローラとリクエストを生成して、そこからViewContextをガメるという作戦。
続いてrails_helper.rb
に以下のコードを追加する。
📄spec/decorator/hoge_decorator_spec.rb
config.include DecoratorSpecHelper, type: :decorator
あとはテストしたいデコレーターにtype: :decorator
を忘れずに付けるだけ。
require 'rails_helper' RSpec.describe HogeDecorator, type: :decorator do ... let(:video) do ActiveDecorator::Decorator.instance.decorate(Hoge.new) end ...
以上。
関連する記事
- rspecを実行するVimプラグイン【run-rspec.vim】を作った
- rspecの出力結果をジョジョ風にしてみる
- ActiveRecord依存のModuleをrspecでテストする
- 自分はこんな感じでRailsアプリを作っております
- Rails用のgemを作成する手順 (Rails 4.0以降)
active_decorator-rspec も最近rails5.1まで対応したみたいです 🙂
https://github.com/mizoR/active_decorator-rspec/pull/9
情報ありがとうございます。
注記を追記しました。