diff --git a/lib/rspec/mocks/any_instance.rb b/lib/rspec/mocks/any_instance.rb index e287f9d10..629a1f786 100644 --- a/lib/rspec/mocks/any_instance.rb +++ b/lib/rspec/mocks/any_instance.rb @@ -24,6 +24,7 @@ module AnyInstance # @return [Recorder] def any_instance RSpec::Mocks::space.add(self) + modify_dup_to_remove_mock_proxy_when_invoked __recorder end @@ -33,13 +34,45 @@ def rspec_verify super ensure __recorder.stop_all_observation! + restore_dup @__recorder = nil end - + + # @private + def rspec_reset + restore_dup + __mock_proxy.reset + end + # @private def __recorder @__recorder ||= AnyInstance::Recorder.new(self) end + + private + def modify_dup_to_remove_mock_proxy_when_invoked + unless self.method_defined?(:__rspec_original_dup) + self.class_eval do + def __rspec_dup + __remove_mock_proxy + __rspec_original_dup + end + + alias_method :__rspec_original_dup, :dup + alias_method :dup, :__rspec_dup + end + end + end + + def restore_dup + if self.method_defined?(:__rspec_original_dup) + self.class_eval do + alias_method :dup, :__rspec_original_dup + remove_method :__rspec_original_dup + remove_method :__rspec_dup + end + end + end end end end diff --git a/lib/rspec/mocks/methods.rb b/lib/rspec/mocks/methods.rb index 87433bf60..682601a41 100644 --- a/lib/rspec/mocks/methods.rb +++ b/lib/rspec/mocks/methods.rb @@ -135,6 +135,10 @@ def __mock_proxy mp end end + + def __remove_mock_proxy + @mock_proxy = nil + end def format_chain(*chain, &blk) if Hash === chain.last diff --git a/spec/rspec/mocks/any_instance/issue_120.rb b/spec/rspec/mocks/any_instance/issue_120.rb index 4c3c1f092..48b6d5782 100644 --- a/spec/rspec/mocks/any_instance/issue_120.rb +++ b/spec/rspec/mocks/any_instance/issue_120.rb @@ -7,7 +7,7 @@ module Mocks Object.any_instance.stub(:some_method) o = Object.new o.some_method - o.dup.some_method + lambda { o.dup.some_method }.should_not raise_error(SystemStackError) end end end