Simple mock: override_method
# Overrides the method +method_name+ in +obj+ with the passed block def override_method(obj, method_name, &block) # Get the singleton class/eigenclass for 'obj' klass = class <<obj; self; end # Undefine the old method (using 'send' since 'undef_method' is protected) klass.send(:undef_method, method_name) # Create the new method klass.send(:define_method, method_name, block) end # Just an example class class Foo def do_stuff "I'm okay!" end end # Test code list = [] 5.times { list.push(Foo.new) } # We override the method here! override_method(list.first, :do_stuff) { "I'm NOT okay!" } list.each_with_index { |f, i| puts "(#{i}) #{f.do_stuff}" }
Outputs:
(0) I'm NOT okay!
(1) I'm okay!
(2) I'm okay!
(3) I'm okay!
(4) I'm okay!