Module: RSpec::Rails::ControllerExampleGroup

Extended by:
ActiveSupport::Concern
Includes:
ActionController::TestCase::Behavior, Matchers::RedirectTo, Matchers::RenderTemplate, Matchers::RoutingMatchers, RailsExampleGroup, ViewRendering
Defined in:
lib/rspec/rails/example/controller_example_group.rb

Overview

Extends ActionController::TestCase::Behavior to work with RSpec.

Examples

with stubs

describe WidgetsController do
  describe "GET index" do
    it "assigns all widgets to @widgets" do
      widget = stub_model(Widget)
      Widget.stub(:all) { widget }
      get :index
      assigns(:widgets).should eq([widget])
    end
  end
end

with a factory

describe WidgetsController do
  describe "GET index" do
    it "assigns all widgets to @widgets" do
      widget = Factory(:widget)
      get :index
      assigns(:widgets).should eq([widget])
    end
  end
end

with fixtures

describe WidgetsController do
  describe "GET index" do
    fixtures :widgets

    it "assigns all widgets to @widgets" do
      get :index
      assigns(:widgets).should eq(Widget.all)
    end
  end
end

Matchers

In addition to the stock matchers from rspec-expectations, controller specs add these matchers, which delegate to rails’ assertions:

response.should render_template(*args)
=> delegates to assert_template(*args)

response.should redirect_to(destination)
=> delegates to assert_redirected_to(destination)

Isolation from views

RSpec’s preferred approach to spec’ing controller behaviour is to isolate the controller from its collaborators. By default, therefore, controller example groups do not render the views in your app. Due to the way Rails searches for view templates, the template still needs to exist, but it won’t actually be loaded.

NOTE that this is different from rspec-rails-1 with rails-2, which did not require the presence of the file at all. Due to changes in rails-3, this was no longer feasible in rspec-rails-2.

View rendering

If you prefer a more integrated approach, similar to that of Rails’ functional tests, you can tell controller groups to render the views in the app with the render_views declaration:

describe WidgetsController do
  render_views
  ...

Defined Under Namespace

Modules: ClassMethods, InstanceMethods

Instance Attribute Summary

Attributes included from ViewRendering

#controller