【Rails 5】ヘルパーを使用しているactive_decoratorをrspecでテストする


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
...

以上。

関連する記事


「【Rails 5】ヘルパーを使用しているactive_decoratorをrspecでテストする」への2件のフィードバック

コメントする

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください