Как проверить конкретный метод абстрактного класса без ручного подкласса?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как проверить конкретный метод абстрактного класса без ручного подкласса?

Сообщение Anonymous »

У меня есть абстрактный класс Python с конкретным методом: < /p>

Код: Выделить всё

class AbstractFoo(abc.ABC):
def append_something(self, text: str) -> str:
return text + self.create_something(len(text))

@abc.abstractmethod
def create_something(self, number: int) -> str:
raise NotImplementedError()

# IMPORTANT: many other abstract methods irrelevant for the test omitted here
Учитывая, что существует много абстрактных методов, я ищу способ проверить конкретный метод без необходимости вручную подкласса и реализовать все эти методы. Я надеялся как -то использовать фиктивный экземпляр класса.

Код: Выделить всё

# Without this, `AbstractFoo` cannot be instantiated.
AbstractFoo.__abstractmethods__ = frozenset()

mock_foo = unittest.mock.Mock(wraps=AbstractFoo())
mock_foo.create_something.return_value = "bar"

assert mock_foo.append_something("foo") == "foobar"
mock_foo.create_something.assert_called_once_with(3)
Даже если я пытаюсь высмеивать возвращаемое значение create_something метод, notimplemplementError из Abstractfoo.create_something повышается, когда mock_foo.append_something ("foo") вызывается. Попытка < /p>
class MockFoo(AbstractFoo):
def create_something(self, number: int) -> str:
return "bar"

MockFoo.__abstractmethods__ = frozenset()

mock_foo = unittest.mock.Mock(wraps=MockFoo())
mock_foo.create_something.side_effect = lambda *args, **kwargs: unittest.mock.DEFAULT

assert mock_foo.append_something("foo") == "foobar"
mock_foo.create_something.assert_called_once_with(3)
< /code>
На этот раз я получаю: < /p>
AssertionError: Expected 'create_something' to be called once. Called 0 times.
< /code>
< /li>
< /ul>
Вопросы: < /p>

В обоих моих неудачных попытках, кажется, не используется. Почему это?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ubclassing
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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