Report abuse

#!/usr/bin/python

class Stub(object):
    """
    A simple class to restore/replace objects. 
    It's not complete, but it's enough for many cases.
    """

    def __init__(self):
        self.funcs = {}

    def replace(self, module, function_name, new_function):
        self.funcs.setdefault(module, {})[function_name] = getattr(module, function_name)
        setattr(module, function_name, new_function)

    def restore(self, module, function_name):
        assert getattr(module, function_name)

        setattr(module, function_name, self.funcs[module][function_name])

# Demo for Stub.
class MyClass(object):
    def hello(self, msg):
        print msg

def new_hello(self, msg):
    print msg + " (by replaced method)"

obj = MyClass()
obj.hello('Testing rocks!')  # Testing rocks!
mystub = stub.Stub()
mystub.replace(MyClass, 'hello', new_hello)
obj.hello('Testing rocks!')  # Testing rocks! (by replaced method)
mystub.restore(MyClass, 'hello')
obj.hello('Testing rocks!')  # Testing rocks!