diff --git a/lib/spec/mocks/proxy.rb b/lib/spec/mocks/proxy.rb index ab51fd5bb..d3bde92b5 100644 --- a/lib/spec/mocks/proxy.rb +++ b/lib/spec/mocks/proxy.rb @@ -125,14 +125,18 @@ def warn_if_nil_class(sym) def define_expected_method(sym) visibility_string = "#{visibility(sym)} :#{sym}" - if target_responds_to?(sym) && !target_metaclass.method_defined?(munge(sym)) - munged_sym = munge(sym) - target_metaclass.instance_eval do - alias_method munged_sym, sym if method_defined?(sym.to_s) + if !@proxied_methods.include?(sym) + if target_responds_to?(sym) && !target_metaclass.method_defined?(munge(sym)) + munged_sym = munge(sym) + target_metaclass.instance_eval do + alias_method munged_sym, sym if method_defined?(sym.to_s) + end + @proxied_methods << sym + elsif target_metaclass.method_defined?(munge(sym)) + @proxied_methods << sym end - @proxied_methods << sym end - + target_metaclass.class_eval(<<-EOF, __FILE__, __LINE__) def #{sym}(*args, &block) __mock_proxy.message_received :#{sym}, *args, &block @@ -144,7 +148,7 @@ def #{sym}(*args, &block) def target_responds_to?(sym) return @target.send(munge(:respond_to?),sym) if @already_proxied_respond_to return @already_proxied_respond_to = true if sym == :respond_to? - return @target.respond_to?(sym) + return @target.respond_to?(sym, true) end def visibility(sym) @@ -193,7 +197,7 @@ def reset_proxied_methods alias_method sym, munged_sym undef_method munged_sym else - undef_method sym + remove_method sym end end end diff --git a/spec/spec/mocks/bug_report_11545_spec.rb b/spec/spec/mocks/bug_report_11545_spec.rb index 212a50e9f..da6f93bb2 100644 --- a/spec/spec/mocks/bug_report_11545_spec.rb +++ b/spec/spec/mocks/bug_report_11545_spec.rb @@ -3,11 +3,11 @@ class LiarLiarPantsOnFire include Spec::MetaClass extend Spec::MetaClass - def respond_to?(sym) + def respond_to?(sym, incl_private=false) true end - def self.respond_to?(sym) + def self.respond_to?(sym, incl_private=false) true end end @@ -31,3 +31,4 @@ def self.respond_to?(sym) LiarLiarPantsOnFire.metaclass.instance_methods.should_not include("something") end end +