rspec-railsのドキュメント読み

2013-06-10T00:00:00+00:00 rspec Ruby Rails

以前から何度かはRailsとRSpecに関する事書いてるけど、ちゃんとドキュメント読みましょうって事で、 https://www.relishapp.com/rspec/rspec-rails/docs を読み進めてみる

Anonymous Controller

Anonymous Controllerは要はコントローラーにメソッド定義しちゃったりしてテストするって感じなのかと。例えばapplication_controller.rbが

class AccessDenied < StandardError; end

class ApplicationController < ActionController::Base
  protect_from_forgery
  rescue_from AccessDenied, :with => :access_denied

  private
    def access_denied
      render :status => :forbidden, :nothing => true
    end
end

まぁAccessDeniedがraiseされたらHTTP403を出すような感じ。でテストを

require "spec_helper"

describe ApplicationController do
  controller do
    def index
      raise AccessDenied
    end
  end

  it "GET #index" do
    get :index
    expect(response).not_to be_success
    expect(response.status).to be(403)
  end
end

っていう感じでコントローラーにアクションぶち込んでそれにアクセスしてテストする。ちなみに

it "GET #index" do
  def controller.index
    render :status => :not_found, :nothing => true
  end

  get :index
  expect(response).not_to be_success
  expect(response.status).to be(404)
end

っていう風に書く事も可能っぽい

bypass_rescue

んでbypass_rescueはrescue_fromを無視しちゃう感じな表現でええんやろか。んまぁそんな感じだろうとは思うんですが、要はrescue_fromで指定した:withに飛ばさずに例外を発生させられるっていう所なんだと思われる。実体をソースを読んだ所だと

module ByPassRescue
  def rescue_with_handler(exception)
    raise exception
  end
end

def bypass_rescue
  controller.extend(ByPassRescue)
end

みたいな感じになってた。

require "spec_helper"

describe ApplicationController do
  controller do
    def index
      raise AccessDenied
    end
  end

  it "GET #index" do
    bypass_rescue
    expect { get :index }.to raise_error(AccessDenied)
  end
end

みたいにbypass_rescueをしない場合だと、rescue_fromで指定されたように403エラーになる。bypass_rescueをした場合だとraiseされたエラーがそのまま送出されるっていう感じかと

Capybara-WebKitを使う

Rails3+RSpecでのテストを勉強してみる (3) – capybara-webkitを使ってみる -で書いてるので(ry

ヘルパーのテスト

Rails3+RSpecでのテストを勉強してみる (4) – コントローラー及びヘルパーのテスト -を参照

モデルのテスト

Rails3+RSpecでのテストを勉強してみる (1)で書いてるので(ry

以上。とりまぁまだActionMailerとかまで進んでないので部分的な所は省略。まだ読んでない所もあるので逐一追記したりする予定

Laravel使ってみた (3) - Routing - Laravel使ってみた (2) - Configuration -