Макет Python не подтверждает вызов, когда целевой метод вызывается внутри другого метода ⇐ Python

Программы на Python
Anonymous
Макет Python не подтверждает вызов, когда целевой метод вызывается внутри другого метода

Сообщение Anonymous »

Мне не удается выполнить базовую функцию 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

Вернуться в «Python»