vendredi 9 septembre 2016

python patch with side_effect on Object's method is not called with self

I encounter a surprising behaviour of the side_effect parameter in patch.object where the function replacing the original does not receive self

class Animal():
    def __init__(self):
        self.noise = 'Woof'

    def make_noise(self):
        return self.noise

def loud(self):
    return self.noise.toupper() + '!!'


from unittest.mock import patch

dog = Animal()
dog.make_noise()
with patch.object(Animal, 'make_noise', side_effect=loud):
    dog.make_noise()

This give:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/lustre/home/production/Applications/python/python-3.4.4/lib/python3.4/unittest/mock.py", line 902, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/lustre/home/production/Applications/python/python-3.4.4/lib/python3.4/unittest/mock.py", line 968, in _mock_call
    ret_val = effect(*args, **kwargs)
TypeError: loud() missing 1 required positional argument: 'self'

If I change the loud function to

def loud(*args, **kwargs):
    print(args)
    print(kwargs)

I get the following output:

()
{}

Is there a way to replace a function from an object and still receive self?

Aucun commentaire:

Enregistrer un commentaire