Мне не удается выполнить базовую функцию Assert_ Called() в классе, где некоторые методы вызывают внутренние методы.
Пример кода:
from unittest.mock import Mock
class Foo:
def print1(self) -> None:
print("print1 called") # I see this print message
self.print2()
def print2(self) -> None:
print("print2 called") # I see this print message
foo = Foo()
foo_mock = Mock(wraps=foo)
foo_mock.print1()
foo_mock.print1.assert_called() # OK
foo_mock.print2.assert_called() # NOT OK
Похоже, проблема в том, что в print1(self) экземпляр self имеет тип Foo, а не Mock . Вот почему нет никаких регистров для макетного вызова print2.
Это ожидаемое поведение? Обычно self привязан к вызывающему объекту. Это означает, что должен быть передан экземпляр типа Mock. Я предполагаю, что проблема в том, что экземпляр уже был создан, и поэтому все методы были привязаны к немакетированному экземпляру. Я ожидаю, что это будет изменено __init__ Mock.
Есть ли какое-нибудь решение этой проблемы? Я делаю что-то не так?
РЕДАКТИРОВАТЬ:
Я увидел, что проблему можно решить, выполнив следующее:
import types
from unittest.mock import Mock
class Foo:
def print1(self) -> None:
print("print1 called", type(self))
self.print2()
def print2(self) -> None:
print("print2 called")
foo = Foo()
foo_mock = Mock(wraps=foo)
setattr(foo_mock, "print1", types.MethodType(Mock(wraps=Foo.print1), foo_mock)) # FIX
setattr(foo_mock, "print2", types.MethodType(Mock(wraps=Foo.print2), foo_mock)) # FIX
foo_mock.print1()
foo_mock.print1.assert_called()
foo_mock.print2.assert_called()
Подробнее здесь: https://stackoverflow.com/questions/790 ... ther-metho