How to mock.patch a class method which is a generator/has yield

66 Views Asked by At

How to patch a generator class method. For e.g. in class below, how would we patch get_changed_diff_patch method?

class PassiveJsonMixin(JsonMixin):
    """
    passive items that do not have id/key
    """

    def __init__(self, *args, **kwargs):
        JsonMixin.__init__(self, *args, **kwargs)
        # self.build_json()
        pass
    def get_changed_diff_patch(self, parent_hidden=False):
        print ("From PassiveJsonMixin: get_changed_diff_patch")
        return
        yield

The usual approach

patch.object(mymod.PassiveJsonMixin, 'get_changed_diff_patch',wrapper(mymod.PassiveJsonMixin.get_changed_diff_patch) )
                                                                                                                                                                    

                                                                                                                                                                                                                                                                                                                                          

doesn't seem to work.

1

There are 1 best solutions below

0
On

Expanding a bit on the answer, via using the with context:

from unittest import mock

class MyClass:
    def some_generator(self):
        for i in range(5):
            yield i

    def method_using_generator(self):
        values = []
        for value in self.some_generator():
            values.append(value)
        return values


with mock.patch.object(MyClass, 'some_generator', return_value=[10, 20, 30, 40, 50]):
    my_instance = MyClass()
    result = my_instance.method_using_generator()
    print (result)