Skip to content

Commit

Permalink
Fix with_routing not working with get :index
Browse files Browse the repository at this point in the history
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
  • Loading branch information
sclinede committed Jan 20, 2017
1 parent 0e83a47 commit 88eadea
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
42 changes: 42 additions & 0 deletions lib/rspec/rails/adapters.rb
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,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
Expand Down
6 changes: 2 additions & 4 deletions lib/rspec/rails/example/controller_example_group.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
module RSpec
module Rails
# @private
ControllerAssertionDelegator = RSpec::Rails::AssertionDelegator.new(
ActionDispatch::Assertions::RoutingAssertions
)
ControllerAssertionDelegatorConst = RSpec::Rails::ControllerAssertionDelegator.new

# @api public
# Container module for controller spec functionality.
Expand All @@ -15,7 +13,7 @@ module ControllerExampleGroup
include RSpec::Rails::Matchers::RedirectTo
include RSpec::Rails::Matchers::RenderTemplate
include RSpec::Rails::Matchers::RoutingMatchers
include ControllerAssertionDelegator
include ControllerAssertionDelegatorConst

# Class-level DSL for controller specs.
module ClassMethods
Expand Down

0 comments on commit 88eadea

Please sign in to comment.