Module: RSpec::Rails::ControllerExampleGroup::ClassMethods
- Defined in:
- lib/rspec/rails/example/controller_example_group.rb
Overview
Class-level DSL for controller specs.
Instance Method Summary collapse
-
#controller(base_class = nil, &body) ⇒ Object
Supports a simple DSL for specifying behavior of ApplicationController.
-
#routes(&blk) ⇒ Object
Specifies the routeset that will be used for the example group.
Instance Method Details
#controller(base_class = nil, &body) ⇒ Object
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
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/rspec/rails/example/controller_example_group.rb', line 54 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.to_s 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 = self.routes resource_name = @controller.respond_to?(:controller_name) ? @controller.controller_name.to_sym : :anonymous resource_path = @controller.respond_to?(:controller_path) ? @controller.controller_path : resource_name.to_s 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 |
#routes(&blk) ⇒ Object
Specifies the routeset that will be used for the example group. This is most useful when testing Rails engines.
106 107 108 109 110 |
# File 'lib/rspec/rails/example/controller_example_group.rb', line 106 def routes(&blk) before do self.routes = blk.call end end |