如何使用flexmock调用非现有方法

时间:2013-01-01 12:25:23

标签: python mocking

让我们假设上课:

class Something():
    def first(self):
        return None

我需要用Mock对象替换这个类,但我需要调用或添加不存在的属性。当我尝试

fake = flexmock(Something, new_method=lambda:None)

我收到AttributeError

是否可以添加不存在的属性或方法?

1 个答案:

答案 0 :(得分:1)

向对象或类添加不存在的属性就像something.new_attr = some_valuesetattr(something, 'new_attr', some_value)一样简单。要向对象或类添加不存在的方法,只需调用以下函数之一:

def add_method(target, method_name): 
    """add class method to a target class or attach a function to a target object"""
    setattr(target, method_name, types.MethodType(lambda x:x, target))
def add_instance_method(target, method_name):
    """add instance method to a target class"""
    setattr(target, method_name, types.MethodType(lambda x:x, None, target))

现在,add_method(Something, 'new_method')会向班级Something添加(虚拟)班级“new_method”,add_method(something, 'new_method')会向对象something添加“new_method” Something(但不适用于Something的其他实例),add_instance_method(Something, 'new_method')会将实例级“new_method”添加到类Something(即可用于{{1}的所有实例1}})。

注意:上述内容不适用于没有Something属性的实例(例如内置类__dict__的实例)。

请检查stackoverflow上的其他问题:Adding a Method to an Existing Object Instance