Skip to main content

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.