Что мне нужно: Убедитесь, что все экземпляры Foo
, созданные внутри оператора with
, имеют foo
метод экземпляра, завернутый в MagicMock через wraps=Foo.foo
. Причина, по которой я хочу этого, заключается в том, чтобы я мог отслеживать call_count
в методе foo
для всех созданных экземпляров Foo
. Теперь, когда я так говорю, это кажется невозможным ...
>>> from mock import patch
...
... class Foo(object):
...
... def foo(self):
... return "foo"
...
... with patch("__main__.Foo.foo", wraps=Foo.foo) as m:
... foo = Foo()
... print(foo.foo())
Traceback (most recent call last):
File "a.py", line 12, in <module>
print(foo.foo())
File "/disk/software/lib/python27/mock/mock.py", line 1062, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/disk/software/lib/python27/mock/mock.py", line 1132, in _mock_call
return self._mock_wraps(*args, **kwargs)
TypeError: unbound method foo() must be called with Foo instance as first argument (got nothing instead)
Проблема. Поддельный foo
метод не привязан к foo
экземпляру, созданному с помощью foo = Foo()
, потому что он является оболочкой для несвязанного метода Foo.foo
. Кто-нибудь знает, как гарантировать, что издеваемый метод привязан к экземпляру?
Что я уже знаю:
>>> foo = Foo()
... with patch.object(foo, "foo", wraps=foo.foo) as m:
... print(foo.foo())
"foo"
Но это не удовлетворяет мое ограничение, согласно которому объект должен быть создан внутри контекста patch
.