user1908678
user1908678

Reputation:

How to call non existing method with flexmock

Lets assume class:

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

I need to replace this class with Mock object but I need to call or add nonexisting attribute to it. When I try

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

I receive AttributeError.

Is it possible to add non existing attribute or method ?

Upvotes: 0

Views: 485

Answers (1)

Hui Zheng
Hui Zheng

Reputation: 10222

Adding a non-existing attribute to an object or class is as easy as something.new_attr = some_value or setattr(something, 'new_attr', some_value). To add a non-existing method to an object or class, just call one of the following functions:

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))

Now, add_method(Something, 'new_method') will add a (dummy) class-level 'new_method' to class Something, add_method(something, 'new_method') will add a 'new_method' to object something of type Something(but not for other instances of Something), add_instance_method(Something, 'new_method') will add a instance-level 'new_method' to class Something(i.e. available for all the instances of Something).

Note: the above doesn't work for instances that has not __dict__ attribute(e.g. instance of built-in class object).

Please check the other question on stackoverflow: Adding a Method to an Existing Object Instance

Upvotes: 1

Related Questions