AttributeError: _mock_methods при расширении класса MagicMock

Можно ли расширить класс MagicMock для создания имитируемых объектов и использовать его в модульных тестах?

Если у меня нет кода в функции инициализации, расширение класса, похоже, работает хорошо

class MockAPI(MagicMock):

    def __init__(self):
        self.x = 20

    def mocked_method(self, param):
        return not param


class TestX(TestCase):
    def setUp(self) -> None:
        self.mocked_api = MockAPI()

    def test_another_method(self):
        self.assertTrue(True)

но это вызывает следующую ошибку:

  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 59, in testPartExecutor
    yield
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/unittest/case.py", line 611, in run
    self.setUp()
  File "/Users/user/project/tests/test_protocols.py", line 46, in setUp
    self.mocked_api = MockAPI()
  File "/Users/user/project/tests/test_protocols.py", line 38, in __init__
    self.x = 20
  File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", line 736, in __setattr__
    elif (self._spec_set and self._mock_methods is not None and
  File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", line 630, in __getattr__
    elif self._mock_methods is not None:
  File "/Users/user/project/venv/lib/python3.7/site-packages/mock/mock.py", line 629, in __getattr__
    raise AttributeError(name)
AttributeError: _mock_methods

person alegria    schedule 23.06.2020    source источник
comment
Вы забыли вызвать super в своем __init__ методе.   -  person MrBean Bremen    schedule 23.06.2020
comment
это исправляет спасибо !!!!   -  person alegria    schedule 23.06.2020


Ответы (1)


Исправлено добавлением super().__init__():

class MockAPI(MagicMock):
    def __init__(self):
        super().__init__()
        self.x = 20

    def mocked_method(self, param):
        return not param



class TestX(TestCase):
    def setUp(self) -> None:
        self.mocked_api = MockAPI()

    def test_another_method(self):
        self.assertTrue(True)
person alegria    schedule 24.06.2020