|  | 
 | .. currentmodule:: mock | 
 |  | 
 |  | 
 | .. _magic-methods: | 
 |  | 
 | Mocking Magic Methods | 
 | ===================== | 
 |  | 
 | .. currentmodule:: mock | 
 |  | 
 | :class:`Mock` supports mocking `magic methods | 
 | <http://www.ironpythoninaction.com/magic-methods.html>`_. This allows mock | 
 | objects to replace containers or other objects that implement Python | 
 | protocols. | 
 |  | 
 | Because magic methods are looked up differently from normal methods [#]_, this | 
 | support has been specially implemented. This means that only specific magic | 
 | methods are supported. The supported list includes *almost* all of them. If | 
 | there are any missing that you need please let us know! | 
 |  | 
 | You mock magic methods by setting the method you are interested in to a function | 
 | or a mock instance. If you are using a function then it *must* take ``self`` as | 
 | the first argument [#]_. | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> def __str__(self): | 
 |    ...     return 'fooble' | 
 |    ... | 
 |    >>> mock = Mock() | 
 |    >>> mock.__str__ = __str__ | 
 |    >>> str(mock) | 
 |    'fooble' | 
 |  | 
 |    >>> mock = Mock() | 
 |    >>> mock.__str__ = Mock() | 
 |    >>> mock.__str__.return_value = 'fooble' | 
 |    >>> str(mock) | 
 |    'fooble' | 
 |  | 
 |    >>> mock = Mock() | 
 |    >>> mock.__iter__ = Mock(return_value=iter([])) | 
 |    >>> list(mock) | 
 |    [] | 
 |  | 
 | One use case for this is for mocking objects used as context managers in a | 
 | `with` statement: | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> mock = Mock() | 
 |    >>> mock.__enter__ = Mock(return_value='foo') | 
 |    >>> mock.__exit__ = Mock(return_value=False) | 
 |    >>> with mock as m: | 
 |    ...     assert m == 'foo' | 
 |    ... | 
 |    >>> mock.__enter__.assert_called_with() | 
 |    >>> mock.__exit__.assert_called_with(None, None, None) | 
 |  | 
 | Calls to magic methods do not appear in :attr:`~Mock.method_calls`, but they | 
 | are recorded in :attr:`~Mock.mock_calls`. | 
 |  | 
 | .. note:: | 
 |  | 
 |    If you use the `spec` keyword argument to create a mock then attempting to | 
 |    set a magic method that isn't in the spec will raise an `AttributeError`. | 
 |  | 
 | The full list of supported magic methods is: | 
 |  | 
 | * ``__hash__``, ``__sizeof__``, ``__repr__`` and ``__str__`` | 
 | * ``__dir__``, ``__format__`` and ``__subclasses__`` | 
 | * ``__floor__``, ``__trunc__`` and ``__ceil__`` | 
 | * Comparisons: ``__cmp__``, ``__lt__``, ``__gt__``, ``__le__``, ``__ge__``, | 
 |   ``__eq__`` and ``__ne__`` | 
 | * Container methods: ``__getitem__``, ``__setitem__``, ``__delitem__``, | 
 |   ``__contains__``, ``__len__``, ``__iter__``, ``__getslice__``, | 
 |   ``__setslice__``, ``__reversed__`` and ``__missing__`` | 
 | * Context manager: ``__enter__`` and ``__exit__`` | 
 | * Unary numeric methods: ``__neg__``, ``__pos__`` and ``__invert__`` | 
 | * The numeric methods (including right hand and in-place variants): | 
 |   ``__add__``, ``__sub__``, ``__mul__``, ``__div__``, | 
 |   ``__floordiv__``, ``__mod__``, ``__divmod__``, ``__lshift__``, | 
 |   ``__rshift__``, ``__and__``, ``__xor__``, ``__or__``, and ``__pow__`` | 
 | * Numeric conversion methods: ``__complex__``, ``__int__``, ``__float__``, | 
 |   ``__index__`` and ``__coerce__`` | 
 | * Descriptor methods: ``__get__``, ``__set__`` and ``__delete__`` | 
 | * Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, | 
 |   ``__getnewargs__``, ``__getstate__`` and ``__setstate__`` | 
 |  | 
 |  | 
 | The following methods are supported in Python 2 but don't exist in Python 3: | 
 |  | 
 | * ``__unicode__``, ``__long__``, ``__oct__``, ``__hex__`` and ``__nonzero__`` | 
 | *  ``__truediv__`` and ``__rtruediv__`` | 
 |  | 
 | The following methods are supported in Python 3 but don't exist in Python 2: | 
 |  | 
 | * ``__bool__`` and ``__next__`` | 
 |  | 
 | The following methods exist but are *not* supported as they are either in use by | 
 | mock, can't be set dynamically, or can cause problems: | 
 |  | 
 | * ``__getattr__``, ``__setattr__``, ``__init__`` and ``__new__`` | 
 | * ``__prepare__``, ``__instancecheck__``, ``__subclasscheck__``, ``__del__`` | 
 |  | 
 |  | 
 |  | 
 | Magic Mock | 
 | ========== | 
 |  | 
 | There are two `MagicMock` variants: `MagicMock` and `NonCallableMagicMock`. | 
 |  | 
 |  | 
 | .. class:: MagicMock(*args, **kw) | 
 |  | 
 |    ``MagicMock`` is a subclass of :class:`Mock` with default implementations | 
 |    of most of the magic methods. You can use ``MagicMock`` without having to | 
 |    configure the magic methods yourself. | 
 |  | 
 |    The constructor parameters have the same meaning as for :class:`Mock`. | 
 |  | 
 |    If you use the `spec` or `spec_set` arguments then *only* magic methods | 
 |    that exist in the spec will be created. | 
 |  | 
 |  | 
 | .. class:: NonCallableMagicMock(*args, **kw) | 
 |  | 
 |     A non-callable version of `MagicMock`. | 
 |  | 
 |     The constructor parameters have the same meaning as for | 
 |     :class:`MagicMock`, with the exception of `return_value` and | 
 |     `side_effect` which have no meaning on a non-callable mock. | 
 |  | 
 | The magic methods are setup with `MagicMock` objects, so you can configure them | 
 | and use them in the usual way: | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> mock = MagicMock() | 
 |    >>> mock[3] = 'fish' | 
 |    >>> mock.__setitem__.assert_called_with(3, 'fish') | 
 |    >>> mock.__getitem__.return_value = 'result' | 
 |    >>> mock[2] | 
 |    'result' | 
 |  | 
 | By default many of the protocol methods are required to return objects of a | 
 | specific type. These methods are preconfigured with a default return value, so | 
 | that they can be used without you having to do anything if you aren't interested | 
 | in the return value. You can still *set* the return value manually if you want | 
 | to change the default. | 
 |  | 
 | Methods and their defaults: | 
 |  | 
 | * ``__lt__``: NotImplemented | 
 | * ``__gt__``: NotImplemented | 
 | * ``__le__``: NotImplemented | 
 | * ``__ge__``: NotImplemented | 
 | * ``__int__`` : 1 | 
 | * ``__contains__`` : False | 
 | * ``__len__`` : 1 | 
 | * ``__iter__`` : iter([]) | 
 | * ``__exit__`` : False | 
 | * ``__complex__`` : 1j | 
 | * ``__float__`` : 1.0 | 
 | * ``__bool__`` : True | 
 | * ``__nonzero__`` : True | 
 | * ``__oct__`` : '1' | 
 | * ``__hex__`` : '0x1' | 
 | * ``__long__`` : long(1) | 
 | * ``__index__`` : 1 | 
 | * ``__hash__`` : default hash for the mock | 
 | * ``__str__`` : default str for the mock | 
 | * ``__unicode__`` : default unicode for the mock | 
 | * ``__sizeof__``: default sizeof for the mock | 
 |  | 
 | For example: | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> mock = MagicMock() | 
 |    >>> int(mock) | 
 |    1 | 
 |    >>> len(mock) | 
 |    0 | 
 |    >>> hex(mock) | 
 |    '0x1' | 
 |    >>> list(mock) | 
 |    [] | 
 |    >>> object() in mock | 
 |    False | 
 |  | 
 | The two equality method, `__eq__` and `__ne__`, are special (changed in | 
 | 0.7.2). They do the default equality comparison on identity, using a side | 
 | effect, unless you change their return value to return something else: | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> MagicMock() == 3 | 
 |    False | 
 |    >>> MagicMock() != 3 | 
 |    True | 
 |    >>> mock = MagicMock() | 
 |    >>> mock.__eq__.return_value = True | 
 |    >>> mock == 3 | 
 |    True | 
 |  | 
 | In `0.8` the `__iter__` also gained special handling implemented with a | 
 | side effect. The return value of `MagicMock.__iter__` can be any iterable | 
 | object and isn't required to be an iterator: | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> mock = MagicMock() | 
 |    >>> mock.__iter__.return_value = ['a', 'b', 'c'] | 
 |    >>> list(mock) | 
 |    ['a', 'b', 'c'] | 
 |    >>> list(mock) | 
 |    ['a', 'b', 'c'] | 
 |  | 
 | If the return value *is* an iterator, then iterating over it once will consume | 
 | it and subsequent iterations will result in an empty list: | 
 |  | 
 | .. doctest:: | 
 |  | 
 |    >>> mock.__iter__.return_value = iter(['a', 'b', 'c']) | 
 |    >>> list(mock) | 
 |    ['a', 'b', 'c'] | 
 |    >>> list(mock) | 
 |    [] | 
 |  | 
 | ``MagicMock`` has all of the supported magic methods configured except for some | 
 | of the obscure and obsolete ones. You can still set these up if you want. | 
 |  | 
 | Magic methods that are supported but not setup by default in ``MagicMock`` are: | 
 |  | 
 | * ``__cmp__`` | 
 | * ``__getslice__`` and ``__setslice__`` | 
 | * ``__coerce__`` | 
 | * ``__subclasses__`` | 
 | * ``__dir__`` | 
 | * ``__format__`` | 
 | * ``__get__``, ``__set__`` and ``__delete__`` | 
 | * ``__reversed__`` and ``__missing__`` | 
 | * ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, ``__getnewargs__``, | 
 |   ``__getstate__`` and ``__setstate__`` | 
 | * ``__getformat__`` and ``__setformat__`` | 
 |  | 
 |  | 
 |  | 
 | ------------ | 
 |  | 
 | .. [#] Magic methods *should* be looked up on the class rather than the | 
 |    instance. Different versions of Python are inconsistent about applying this | 
 |    rule. The supported protocol methods should work with all supported versions | 
 |    of Python. | 
 | .. [#] The function is basically hooked up to the class, but each ``Mock`` | 
 |    instance is kept isolated from the others. |