Я пытаюсь смоделировать магические методы операторов на месте, например __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()
По-моему, это причина, по которой он терпит неудачу.
Итак, как мне правильно высмеивать арифметические магические методы на месте?