render_template matcher

The render_template matcher is used to specify that a request renders a given template or layout. It delegates to assert_template

It is available in controller specs (spec/controllers) and request specs (spec/requests).

NOTE: use redirect_to(:action => 'new') for redirects, not render_template.

Using render_template with three possible options

Given a file named “spec/controllers/gadgets_spec.rb” with:

require "rails_helper"

RSpec.describe GadgetsController do
  describe "GET #index" do
    subject { get :index }

    it "renders the index template" do
      expect(subject).to render_template(:index)
      expect(subject).to render_template("index")
      expect(subject).to render_template("gadgets/index")
    end

    it "does not render a different template" do
      expect(subject).to_not render_template("gadgets/show")
    end
  end
end

When I run rspec spec/controllers/gadgets_spec.rb

Then the examples should all pass.

Specify that a request renders a given layout

Given a file named “spec/controllers/gadgets_spec.rb” with:

require "rails_helper"

RSpec.describe GadgetsController do
  describe "GET #index" do
    subject { get :index }

    it "renders the application layout" do
      expect(subject).to render_template("layouts/application")
    end

    it "does not render a different layout" do
      expect(subject).to_not render_template("layouts/admin")
    end
  end
end

When I run rspec spec/controllers/gadgets_spec.rb

Then the examples should all pass.

Using render_template in a view spec

Given a file named “spec/views/gadgets/index.html.erb_spec.rb” with:

require "rails_helper"

RSpec.describe "gadgets/index" do
  it "renders the index template" do
    assign(:gadgets, [Gadget.create!])
    render

    expect(view).to render_template(:index)
    expect(view).to render_template("index")
    expect(view).to render_template("gadgets/index")
  end

  it "does not render a different template" do
    expect(view).to_not render_template("gadgets/show")
  end
end

When I run rspec spec/views

Then the examples should all pass.