Как смоделировать арифметические операторы на месте - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь смоделировать магические методы операторов на месте, например __iadd__, с помощью MagicMock из unittest.mock, но утверждение вызова неожиданно завершается неудачей:

>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> m += 1
>>> m.__iadd__.assert_called_once()  # This expected NOT to fail
Traceback (most recent call last):
  ...
AssertionError: Expected '__iadd__' to have been called once. Called 0 times.

Насмешка над другими магическими методами работает отлично:

>>> m = MagicMock()
>>> m + 1
>>> m.__add__.assert_called_once()
>>> # No error

После выполнения m += 1 устанавливает m для нового экземпляра MagicMock, поскольку все методы mock возвращают новые mock. Мы переопределяем __iadd__ в обычных классах следующим образом:

class A:
    def __iadd__(self, other):
        ...
        return self  # <-- We must return self

Но все методы макета, включая __iadd__, выглядят так:

def __iadd__(self, *args, **kwargs):
    ...
    return MagicMock()

По-моему, это причина, по которой он терпит неудачу.


Итак, как мне правильно высмеивать арифметические магические методы на месте?

1 Ответ

0 голосов
/ 02 августа 2018

Измените возвращаемое значение __iadd__ следующим образом:

>>> m = MagicMock()
>>> m.__iadd__.return_value = m
>>> m += 1
>>> m.__iadd__.assert_called_once()
>>> m.__iadd__.call_count
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...