diff options
Diffstat (limited to 'actionpack/lib/action_dispatch/testing')
| -rw-r--r-- | actionpack/lib/action_dispatch/testing/assertions/routing.rb | 37 | 
1 files changed, 27 insertions, 10 deletions
diff --git a/actionpack/lib/action_dispatch/testing/assertions/routing.rb b/actionpack/lib/action_dispatch/testing/assertions/routing.rb index af41521c5c..0e8712f8d9 100644 --- a/actionpack/lib/action_dispatch/testing/assertions/routing.rb +++ b/actionpack/lib/action_dispatch/testing/assertions/routing.rb @@ -138,6 +138,20 @@ module ActionDispatch          assert_generates(path.is_a?(Hash) ? path[:path] : path, generate_options, defaults, extras, message)        end +      # Provides a hook on `finalize!` so we can mutate a controller after the +      # route set has been drawn. +      class WithRouting < ActionDispatch::Routing::RouteSet # :nodoc: +        def initialize(&block) +          super() +          @block = block +        end + +        def finalize! +          super +          @block.call self +        end +      end +        # A helper to make it easier to test different route configurations.        # This method temporarily replaces @routes with a new RouteSet instance.        # @@ -152,16 +166,19 @@ module ActionDispatch        #   end        #        def with_routing -        old_routes, @routes = @routes, ActionDispatch::Routing::RouteSet.new -        if defined?(@controller) && @controller -          old_controller, @controller = @controller, @controller.clone -          _routes = @routes - -          @controller.singleton_class.include(_routes.url_helpers) - -          if @controller.respond_to? :view_context_class -            @controller.view_context_class = Class.new(@controller.view_context_class) do -              include _routes.url_helpers +        old_routes = @routes +        old_controller = nil +        @routes = WithRouting.new do |_routes| +          if defined?(@controller) && @controller +            old_controller, @controller = @controller, @controller.clone +            _routes = @routes + +            @controller.singleton_class.include(_routes.url_helpers) + +            if @controller.respond_to? :view_context_class +              @controller.view_context_class = Class.new(@controller.view_context_class) do +                include _routes.url_helpers +              end              end            end          end  | 
