From afebe67c983d5cae289a84e4ddfdf547c6b2e95f Mon Sep 17 00:00:00 2001 From: Sergey Dolganov Date: Fri, 20 Jan 2017 17:42:34 +0500 Subject: [PATCH] Fix `with_routing` not working with `get :index` As guys previously mentioned in the thread the problem is that `#get` is called on other context then `#with_routing`. It is caused by https://github.com/rspec/rspec-rails/blob/master/lib/rspec/rails/example/controller_example_group.rb#L5. ActionDispatch::Assertions::RoutingAssertions is adding #with_routing to an assertion_instance, and ActionController::TestCase::Behavior is adding #get to ControllerExampleGroup. So I decided to add an ControllerAssertionDelegator which will include both of them. Actually AssertionDelegator missed some methods, so I featured them in that delegator. Closes #1652 --- lib/rspec/rails/adapters.rb | 42 +++++++++++++++++++ .../rails/example/controller_example_group.rb | 6 +-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/lib/rspec/rails/adapters.rb b/lib/rspec/rails/adapters.rb index ba8cc394e4..0a6891bc07 100644 --- a/lib/rspec/rails/adapters.rb +++ b/lib/rspec/rails/adapters.rb @@ -60,6 +60,48 @@ def assertion_instance end end + # @private + class ControllerAssertionDelegator < AssertionDelegator + module Setup + extend ActiveSupport::Concern + + included { init_setup } + + module ClassMethods + attr_reader :setup_methods, :setup_blocks + attr_accessor :controller_class + + def init_setup + @setup_methods ||= [] + @setup_blocks ||= [] + end + + def setup(*methods, &block) + @setup_methods += methods + @setup_blocks << block if block + end + end + + def initialize(*) + super + self.class.controller_class = described_class + run_setup + end + + def run_setup + self.class.setup_methods.each { |m| send(m) } + self.class.setup_blocks.each { |b| b.call } + end + end + + def initialize(*args) + args << Setup + args << ActionDispatch::Assertions::RoutingAssertions + args << ActionController::TestCase::Behavior + super(*args) + end + end + # Adapts example groups for `Minitest::Test::LifecycleHooks` # # @private diff --git a/lib/rspec/rails/example/controller_example_group.rb b/lib/rspec/rails/example/controller_example_group.rb index 3150f3d469..d3ced02605 100644 --- a/lib/rspec/rails/example/controller_example_group.rb +++ b/lib/rspec/rails/example/controller_example_group.rb @@ -1,9 +1,7 @@ module RSpec module Rails # @private - ControllerAssertionDelegator = RSpec::Rails::AssertionDelegator.new( - ActionDispatch::Assertions::RoutingAssertions - ) + ControllerAssertionDelegatorInstance = RSpec::Rails::ControllerAssertionDelegator.new # @api public # Container module for controller spec functionality. @@ -15,7 +13,7 @@ module ControllerExampleGroup include RSpec::Rails::Matchers::RedirectTo include RSpec::Rails::Matchers::RenderTemplate include RSpec::Rails::Matchers::RoutingMatchers - include ControllerAssertionDelegator + include ControllerAssertionDelegatorInstance # Class-level DSL for controller specs. module ClassMethods