Augmented Usamimi

it { is_expected.to be_blog.written_by(izumin5210) }

【Rails】Controller Concernのテスト

Controller Concernのテスト

例えばいいねアクションを追加するためのLikableというものがあるとする. これのテストをどうするか.

# app/controllers/concerns/likable.rb
module Likable
  extend ActiveSupport::Concern

  included do
    before_action :set_likable
  end

  def like
    current_user.likes.create(likable: @likable)
    # viewをrenderしたりとか
  end

  private

  def set_likable
    raise NotImplementedError, "#{self.class}#set_likable is not implemented"
  end
end

anonymous controllerをつかう

ApplicationControllerとかをスーパークラスにしてanonymous controllerを作る.

# spec/controllers/concerns/likable_spec.rb
require 'rails_helper'

RSpec.describe Likable, type: :controller do
  controller(Application) do
    include Likable
  end

  # テスト書け
end

routing errorでるときは

routingついかしてあげる.

# spec/controllers/concerns/likable_spec.rb
require 'rails_helper'

RSpec.describe Likable, type: :controller do
  controller(Application) do
    include Likable
  end

  before { routes.draw { put 'like' => 'anonymous#like' } }

  # テスト書け
end

template missingでるときは

アクションをoverrideしてrender nothing: trueする. ただ,moduleで作ったアクションをテストするときはこれだと2重renderになるかも….

たぶん良くない例.

# spec/controllers/concerns/likable_spec.rb
require 'rails_helper'

RSpec.describe Likable, type: :controller do
  controller(Application) do
    include Likable
    def like
      super
      render nothing: true
    end
  end

  before { routes.draw { put 'like' => 'anonymous#like' } }

  # テスト書け
end

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

パーフェクトRuby on Rails

パーフェクトRuby on Rails