メインコンテンツまでスキップ

Controller specs

コントローラスペックは type: :controller でマークされるか、もしくは config.infer_spec_type_from_file_location! を設定している場合には、spec/controllers ディレクトリに配置することによってマークされます。

コントローラーの仕様(spec)はRailsの機能テストのためのRSpecラッパーです (ActionController::TestCase::Behavior)。 これにより、各例で単一のhttpリクエストを模倣し、次のような期待される結果を指定することができます:

  • レンダリングされたテンプレート
  • リダイレクト
  • コントローラーで割り当てられたインスタンス変数がビューと共有される
  • レスポンスで返されるクッキー

To specify outcomes, you can use:

  • standard rspec matchers (expect(response.status).to eq(200))
  • standard test/unit assertions (assert_equal 200, response.status)
  • rails assertions (assert_response 200)
  • rails-specific matchers:
    • render_template

      expect(response).to render_template(:new)   # wraps assert_template
    • redirect_to

      expect(response).to redirect_to(location)   # wraps assert_redirected_to
    • have_http_status

      expect(response).to have_http_status(:created)
    • be_a_new

      expect(assigns(:widget)).to be_a_new(Widget)

Examples

RSpec.describe TeamsController do describe "GET index" do it "assigns @teams" do team = Team.create get :index expect(assigns(:teams)).to eq([team]) end

it "renders the index template" do get :index expect(response).to render_template("index") end end end

Views

Headers

We encourage you to use request specs if you want to set headers in your call. If you still want to use controller specs with custom http headers you can use request.headers:

require "rails_helper"

RSpec.describe TeamsController, type: :controller do describe "GET index" do it "returns a 200" do request.headers["Authorization"] = "foo" get :show expect(response).to have_http_status(:ok) end end end