Permalink
Browse files

Make IntegrationTest::Runner propagate method_missing to ancestors.

Fixes RSpec integration example groups, which mixes its Matchers
module into ActiveSupport::TestCase.

Signed-off-by: Michael Koziarski <michael@koziarski.com>
  • Loading branch information...
1 parent bbaf3a0 commit e10b0ddc7b52f903e8a0898d8907fc0357deb974 @oggy oggy committed with NZKoz Aug 31, 2009
Showing with 24 additions and 2 deletions.
  1. +6 −2 actionpack/lib/action_controller/integration.rb
  2. +18 −0 actionpack/test/controller/integration_test.rb
View
8 actionpack/lib/action_controller/integration.rb
@@ -544,8 +544,12 @@ def copy_session_variables! #:nodoc:
# Delegate unhandled messages to the current session instance.
def method_missing(sym, *args, &block)
reset! unless @integration_session
- returning @integration_session.__send__(sym, *args, &block) do
- copy_session_variables!
+ if @integration_session.respond_to?(sym)
+ returning @integration_session.__send__(sym, *args, &block) do
+ copy_session_variables!
+ end
+ else
+ super
end
end
end
View
18 actionpack/test/controller/integration_test.rb
@@ -207,6 +207,24 @@ def test_opens_new_session
assert_equal ::ActionController::Integration::Session, session2.class
assert_not_equal session1, session2
end
+
+ # RSpec mixes Matchers (which has a #method_missing) into
+ # IntegrationTest's superclass. Make sure IntegrationTest does not
+ # try to delegate these methods to the session object.
+ def test_does_not_prevent_method_missing_passing_up_to_ancestors
+ mixin = Module.new do
+ def method_missing(name, *args)
+ name.to_s == 'foo' ? 'pass' : super
+ end
+ end
+ @test.class.superclass.__send__(:include, mixin)
+ begin
+ assert_equal 'pass', @test.foo
+ ensure
+ # leave other tests as unaffected as possible
+ mixin.__send__(:remove_method, :method_missing)
+ end
+ end
end
# Tests that integration tests don't call Controller test methods for processing.

0 comments on commit e10b0dd

Please sign in to comment.