bpo-35022: unittest.mock.MagicMock now also supports __fspath__ (GH-9960)

The MagicMock class supports many magic methods, but not __fspath__. To ease
testing with modules such as os.path, this function is now supported by default.
This commit is contained in:
Max Bélanger 2018-10-25 14:48:58 -07:00 committed by Victor Stinner
parent 1770d1c512
commit 6c83d9f4a7
4 changed files with 18 additions and 0 deletions

View File

@ -1699,6 +1699,10 @@ The full list of supported magic methods is:
* Descriptor methods: ``__get__``, ``__set__`` and ``__delete__`` * Descriptor methods: ``__get__``, ``__set__`` and ``__delete__``
* Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, * Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``,
``__getnewargs__``, ``__getstate__`` and ``__setstate__`` ``__getnewargs__``, ``__getstate__`` and ``__setstate__``
* File system path representation: ``__fspath__``
.. versionchanged:: 3.8
Added support for :func:`os.PathLike.__fspath__`.
The following methods exist but are *not* supported as they are either in use The following methods exist but are *not* supported as they are either in use

View File

@ -1713,6 +1713,7 @@ magic_methods = (
"complex int float index " "complex int float index "
"round trunc floor ceil " "round trunc floor ceil "
"bool next " "bool next "
"fspath "
) )
numerics = ( numerics = (
@ -1760,6 +1761,7 @@ _calculate_return_value = {
'__hash__': lambda self: object.__hash__(self), '__hash__': lambda self: object.__hash__(self),
'__str__': lambda self: object.__str__(self), '__str__': lambda self: object.__str__(self),
'__sizeof__': lambda self: object.__sizeof__(self), '__sizeof__': lambda self: object.__sizeof__(self),
'__fspath__': lambda self: f"{type(self).__name__}/{self._extract_mock_name()}/{id(self)}",
} }
_return_values = { _return_values = {

View File

@ -1,5 +1,6 @@
import math import math
import unittest import unittest
import os
import sys import sys
from unittest.mock import Mock, MagicMock, _magics from unittest.mock import Mock, MagicMock, _magics
@ -293,6 +294,15 @@ class TestMockingMagicMethods(unittest.TestCase):
# how to test __sizeof__ ? # how to test __sizeof__ ?
def test_magic_methods_fspath(self):
mock = MagicMock()
expected_path = mock.__fspath__()
mock.reset_mock()
self.assertEqual(os.fspath(mock), expected_path)
mock.__fspath__.assert_called_once()
def test_magic_methods_and_spec(self): def test_magic_methods_and_spec(self):
class Iterable(object): class Iterable(object):
def __iter__(self): def __iter__(self):

View File

@ -0,0 +1,2 @@
:class:`unittest.mock.MagicMock` now supports the ``__fspath__`` method
(from :class:`os.PathLike`).