Logo: Relish

  1. Sign in

Project: RSpec Rails 5.0

Controller specs

Controller specs are marked by :type => :controller or if you have set
config.infer_spec_type_from_file_location! by placing them in spec/controllers.

A controller spec is an RSpec wrapper for a Rails functional test
It allows you to simulate a single http request in each example, and then
specify expected outcomes such as:

  • rendered templates
  • redirects
  • instance variables assigned in the controller to be shared with the view
  • cookies sent back with the response

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)


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

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



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)


  1. controller spec
  2. views are stubbed by default
  3. render_views
  4. anonymous controller
  5. bypass rescue
  6. engine routes for controllers
  7. Cookies
  8. Setting request headers

Last published 9 months ago by Jon Rowe.