You have a class whose API you want to verify:
class Class_A(object): def method_X(self): self.method_Y() def method_Y(self): pass
You write the following test fully expecting it to pass. Alas, the
method_Y assertion fails.
def test_class_a(self): obj = Class_A() mock = MagicMock(spec_set=obj, wraps=obj) mock.method_X() mock.method_Y.assert_called_once_with()
This is because the Python Unittest Mock, while wrapping
mock.method_X(), Mock uses
obj in the
__self__ of the
method_Y binding. As a result the
self value passed to
method_X is that of the
obj and not
mock and the call to
method_Y is therefore invisible to the Mock.
Continue reading “How to spy on Mock-wrapped method calls in Python”