aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/testing
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@github.com>2018-09-26 14:21:15 -0700
committerGitHub <noreply@github.com>2018-09-26 14:21:15 -0700
commit7f870a5ba2aa9177aa4a0e03a9d027928ba60e49 (patch)
treeb4fb19def15c5033483ecebe25d4e762ee1a4dab /actionpack/lib/action_dispatch/testing
parent6556898884d636c59baae008e42783b8d3e16440 (diff)
parentb42d246c5d020a46d5964d236eb7f0d857ef01e8 (diff)
downloadrails-7f870a5ba2aa9177aa4a0e03a9d027928ba60e49.tar.gz
rails-7f870a5ba2aa9177aa4a0e03a9d027928ba60e49.tar.bz2
rails-7f870a5ba2aa9177aa4a0e03a9d027928ba60e49.zip
Merge pull request #33970 from rails/eager-url-helpers
Eagerly build the routing helper module after routes are committed
Diffstat (limited to 'actionpack/lib/action_dispatch/testing')
-rw-r--r--actionpack/lib/action_dispatch/testing/assertions/routing.rb37
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