Начнем с того, MagicMock
что это подкласс Mock
.
class MagicMock(MagicMixin, Mock)
В результате MagicMock предоставляет все, что предлагает Mock, и многое другое. Вместо того, чтобы думать о Mock как об урезанной версии MagicMock, подумайте о MagicMock как о расширенной версии Mock. Это должно ответить на ваши вопросы о том, почему существует Mock и что Mock предлагает поверх MagicMock.
Во-вторых, MagicMock предоставляет реализации многих / большинства магических методов по умолчанию, а Mock - нет. Смотрите здесь для получения дополнительной информации о предоставляемых магических методах.
Некоторые примеры предоставляемых магических методов:
>>> int(Mock())
TypeError: int() argument must be a string or a number, not 'Mock'
>>> int(MagicMock())
1
>>> len(Mock())
TypeError: object of type 'Mock' has no len()
>>> len(MagicMock())
0
И это может быть не так интуитивно (по крайней мере, не интуитивно для меня):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Вы можете «увидеть» методы, добавленные в MagicMock, когда эти методы вызываются впервые:
>>> magic1 = MagicMock()
>>> dir(magic1)
['assert_any_call', 'assert_called_once_with', ...]
>>> int(magic1)
1
>>> dir(magic1)
['__int__', 'assert_any_call', 'assert_called_once_with', ...]
>>> len(magic1)
0
>>> dir(magic1)
['__int__', '__len__', 'assert_any_call', 'assert_called_once_with', ...]
Так почему бы не использовать MagicMock все время?
Вопрос, возвращаемый вам: вы согласны с реализациями магического метода по умолчанию? Например, это нормально, mocked_object[1]
чтобы не ошибка? Вы в порядке с любыми непредвиденными последствиями из-за того, что реализации магических методов уже есть?
Если ответ на эти вопросы положительный, тогда используйте MagicMock. В противном случае, придерживайтесь Mock.