読者です 読者をやめる 読者になる 読者になる

元フリーエンジニアライフ

Ruby on Rails とか MovableType とかAWSやってるフリーランスウェブエンジニアの記録でした。現在は法人成りしてIT社長。

Rails RSpec のコントローラテストでデフォルトのパラメータを設定できるようにしてみる。

以前RSpecの拡張の練習がてら、こういうのを

require 'spec_helper'

describe Api::SpotsController do
  describe "GET 'index'" do
    it "returns http success" do
      get 'index', format: 'json'
      response.should be_success
    end
  end

  describe "GET 'show'" do
    let(:spot){ create(:spot) }
    it "returns http success" do
      get 'show', id: spot.id, format: 'json'
      response.should be_success
    end
  end
end

こうかけるようにしたコードを書いていたので、思いだしメモ。

require 'spec_helper'

describe Api::SpotsController do
  default_params format: 'json'
  describe "GET 'index'" do
    it "returns http success" do
      get 'index'
      response.should be_success
    end
  end

  describe "GET 'show'" do
    let(:spot){ create(:spot) }
    it "returns http success" do
      get 'show', id: spot.id
      response.should be_success
    end
  end
end

spec/support/process_with_default_params.rb

class ActionController::TestCase < ActiveSupport::TestCase
  module Behavior
    def process_with_default_params(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
      parameters ||= {}
      parameters.reverse_merge! self.default_params
      process_without_default_params(action, parameters, session, flash, http_method)
    end
    alias_method_chain :process, :default_params
  end
end

module ProcessWithDefaultParams

  module ExampleGroupMethods
    def default_params(params)
      let(:__default_params){ params }
    end
  end

  module ExampleMethods
    def default_params
      self.respond_to?(:__default_params) ? __default_params : {}
    end
  end

  def self.included(mod)
    mod.extend ExampleGroupMethods
    mod.__send__ :include, ExampleMethods
  end
end

RSpec.configure do |config|
  config.include ProcessWithDefaultParams
end