module RSpec::Rails::ControllerExampleGroup::ClassMethods

Public Class Methods

name() click to toggle source
# File lib/rspec/rails/example/controller_example_group.rb, line 63
def self.name; "AnonymousController"; end

Public Instance Methods

controller(base_class = nil, &body) click to toggle source

Supports a simple DSL for specifying behavior of ApplicationController. Creates an anonymous subclass of ApplicationController and evals the `body` in that context. Also sets up implicit routes for this controller, that are separate from those defined in “config/routes.rb”.

@note Due to Ruby 1.8 scoping rules in anoymous subclasses, constants

defined in `ApplicationController` must be fully qualified (e.g.
`ApplicationController::AccessDenied`) in the block passed to the
`controller` method. Any instance methods, filters, etc, that are
defined in `ApplicationController`, however, are accessible from
within the block.

@example

describe ApplicationController do
  controller do
    def index
      raise ApplicationController::AccessDenied
    end
  end

  describe "handling AccessDenied exceptions" do
    it "redirects to the /401.html page" do
      get :index
      response.should redirect_to("/401.html")
    end
  end
end

If you would like to spec a subclass of ApplicationController, call controller like so:

controller(ApplicationControllerSubclass) do
  # ....
end
# File lib/rspec/rails/example/controller_example_group.rb, line 57
def controller(base_class = nil, &body)
  base_class ||= RSpec.configuration.infer_base_class_for_anonymous_controllers? ?
                   controller_class :
                   ApplicationController

  metadata[:example_group][:described_class] = Class.new(base_class) do
    def self.name; "AnonymousController"; end
  end
  metadata[:example_group][:described_class].class_eval(&body)

  before do
    @orig_routes = self.routes
    self.routes  = ActionDispatch::Routing::RouteSet.new.tap { |r|
      r.draw { resources :anonymous }
    }
  end

  after do
    self.routes  = @orig_routes
    @orig_routes = nil
  end
end
controller_class() click to toggle source

@private

# File lib/rspec/rails/example/controller_example_group.rb, line 18
def controller_class
  described_class
end
routes(&blk) click to toggle source

Specifies the routeset that will be used for the example group. This is most useful when testing Rails engines.

@example

describe MyEngine::PostsController do
  routes { MyEngine::Engine.routes }

  # ...
end
# File lib/rspec/rails/example/controller_example_group.rb, line 90
def routes(&blk)
  before do
    self.routes = blk.call
  end
end