From 6c83d9f4a72905d968418bef670bb3091d2744db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20B=C3=A9langer?= Date: Thu, 25 Oct 2018 14:48:58 -0700 Subject: [PATCH] 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. --- Doc/library/unittest.mock.rst | 4 ++++ Lib/unittest/mock.py | 2 ++ Lib/unittest/test/testmock/testmagicmethods.py | 10 ++++++++++ .../Library/2018-10-18-17-57-28.bpo-35022.KeEF4T.rst | 2 ++ 4 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2018-10-18-17-57-28.bpo-35022.KeEF4T.rst diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 136804cfc2c..0ae29546586 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1699,6 +1699,10 @@ The full list of supported magic methods is: * Descriptor methods: ``__get__``, ``__set__`` and ``__delete__`` * Pickling: ``__reduce__``, ``__reduce_ex__``, ``__getinitargs__``, ``__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 diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 6b7f293bc5e..1a6c1a606c5 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1713,6 +1713,7 @@ magic_methods = ( "complex int float index " "round trunc floor ceil " "bool next " + "fspath " ) numerics = ( @@ -1760,6 +1761,7 @@ _calculate_return_value = { '__hash__': lambda self: object.__hash__(self), '__str__': lambda self: object.__str__(self), '__sizeof__': lambda self: object.__sizeof__(self), + '__fspath__': lambda self: f"{type(self).__name__}/{self._extract_mock_name()}/{id(self)}", } _return_values = { diff --git a/Lib/unittest/test/testmock/testmagicmethods.py b/Lib/unittest/test/testmock/testmagicmethods.py index 5ab95978f60..69dfe60f7ea 100644 --- a/Lib/unittest/test/testmock/testmagicmethods.py +++ b/Lib/unittest/test/testmock/testmagicmethods.py @@ -1,5 +1,6 @@ import math import unittest +import os import sys from unittest.mock import Mock, MagicMock, _magics @@ -293,6 +294,15 @@ class TestMockingMagicMethods(unittest.TestCase): # 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): class Iterable(object): def __iter__(self): diff --git a/Misc/NEWS.d/next/Library/2018-10-18-17-57-28.bpo-35022.KeEF4T.rst b/Misc/NEWS.d/next/Library/2018-10-18-17-57-28.bpo-35022.KeEF4T.rst new file mode 100644 index 00000000000..426be70ceac --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-10-18-17-57-28.bpo-35022.KeEF4T.rst @@ -0,0 +1,2 @@ +:class:`unittest.mock.MagicMock` now supports the ``__fspath__`` method +(from :class:`os.PathLike`).