Module: RSpec::Rails::ControllerExampleGroup::ClassMethods
Relationships & Source Files | |
Defined in: | rspec-rails/lib/rspec/rails/example/controller_example_group.rb |
Overview
Class-level DSL for controller specs.
Instance Method Summary
-
#controller(base_class = nil, &body)
Supports a simple DSL for specifying behavior of ApplicationController.
- #controller_class Internal use only Internal use only
-
#routes
Specifies the routeset that will be used for the example group.
Instance Method Details
#controller(base_class = nil, &body)
Due to Ruby 1.8 scoping rules in anonymous 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.
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”.
If you would like to spec a subclass of ApplicationController, call controller like so:
controller(ApplicationControllerSubclass) do
# ....
end
# File 'rspec-rails/lib/rspec/rails/example/controller_example_group.rb', line 61
def controller(base_class = nil, &body) if RSpec.configuration.infer_base_class_for_anonymous_controllers? base_class ||= controller_class end base_class ||= defined?(ApplicationController) ? ApplicationController : ActionController::Base new_controller_class = Class.new(base_class) do def self.name root_controller = defined?(ApplicationController) ? ApplicationController : ActionController::Base if superclass == root_controller || superclass.abstract? "AnonymousController" else superclass.name end end end new_controller_class.class_exec(&body) (class << self; self; end).__send__(:define_method, :controller_class) { new_controller_class } before do @orig_routes = routes resource_name = if @controller.respond_to?(:controller_name) @controller.controller_name.to_sym else :anonymous end resource_path = if @controller.respond_to?(:controller_path) @controller.controller_path else resource_name.to_s end resource_module = resource_path.rpartition('/').first.presence resource_as = 'anonymous_' + resource_path.tr('/', '_') self.routes = ActionDispatch::Routing::RouteSet.new.tap do |r| r.draw do resources resource_name, as: resource_as, module: resource_module, path: resource_path end end end after do self.routes = @orig_routes @orig_routes = nil end end
#controller_class
# File 'rspec-rails/lib/rspec/rails/example/controller_example_group.rb', line 23
def controller_class described_class end
#routes
Specifies the routeset that will be used for the example group. This is most useful when testing ::RSpec::Rails
engines.
# File 'rspec-rails/lib/rspec/rails/example/controller_example_group.rb', line 119
def routes before do self.routes = yield end end