cpython: 98f061402fcf (original) (raw)
Mercurial > cpython
changeset 106095:98f061402fcf
Issue #20804: The unittest.mock.sentinel attributes now preserve their identity when they are copied or pickled. [#20804]
Serhiy Storchaka storchaka@gmail.com | |
---|---|
date | Wed, 11 Jan 2017 20:13:03 +0200 |
parents | a76eed0baa0f |
children | 2b7b203e3909 |
files | Doc/library/unittest.mock.rst Doc/whatsnew/3.7.rst Lib/unittest/mock.py Lib/unittest/test/testmock/testsentinel.py Misc/NEWS |
diffstat | 5 files changed, 33 insertions(+), 0 deletions(-)[+] [-] Doc/library/unittest.mock.rst 4 Doc/whatsnew/3.7.rst 7 Lib/unittest/mock.py 6 Lib/unittest/test/testmock/testsentinel.py 13 Misc/NEWS 3 |
line wrap: on
line diff
--- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -1831,6 +1831,10 @@ sentinel the same attribute will always return the same object. The objects returned have a sensible repr so that test failure messages are readable.
- .. versionchanged:: 3.7
The ``sentinel`` attributes now preserve their identity when they are[](#l1.8)
:mod:`copied <copy>` or :mod:`pickled <pickle>`.[](#l1.9)
+
Sometimes when testing you need to test that a specific object is passed as an
argument to another method, or returned. It can be common to create named
sentinel objects to test this. :data:sentinel
provides a convenient way of
--- a/Doc/whatsnew/3.7.rst
+++ b/Doc/whatsnew/3.7.rst
@@ -93,6 +93,13 @@ New Modules
Improved Modules
================
+unittest.mock
+-------------
+
+The :const:~unittest.mock.sentinel
attributes now preserve their identity
+when they are :mod:copied <copy>
or :mod:pickled <pickle>
.
+(Contributed by Serhiy Storchaka in :issue:20804
.)
+
Optimizations
=============
--- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -238,6 +238,9 @@ class _SentinelObject(object): def repr(self): return 'sentinel.%s' % self.name
+ class _Sentinel(object): """Access attributes to return a named object, usable as a sentinel.""" @@ -250,6 +253,9 @@ class _Sentinel(object): raise AttributeError return self._sentinels.setdefault(name, _SentinelObject(name))
--- a/Lib/unittest/test/testmock/testsentinel.py +++ b/Lib/unittest/test/testmock/testsentinel.py @@ -1,4 +1,6 @@ import unittest +import copy +import pickle from unittest.mock import sentinel, DEFAULT @@ -23,6 +25,17 @@ class SentinelTest(unittest.TestCase): # If this doesn't raise an AttributeError then help(mock) is broken self.assertRaises(AttributeError, lambda: sentinel.bases)
- def testPickle(self):
for proto in range(pickle.HIGHEST_PROTOCOL+1):[](#l4.15)
with self.subTest(protocol=proto):[](#l4.16)
pickled = pickle.dumps(sentinel.whatever, proto)[](#l4.17)
unpickled = pickle.loads(pickled)[](#l4.18)
self.assertIs(unpickled, sentinel.whatever)[](#l4.19)
- def testCopy(self):
self.assertIs(copy.copy(sentinel.whatever), sentinel.whatever)[](#l4.22)
self.assertIs(copy.deepcopy(sentinel.whatever), sentinel.whatever)[](#l4.23)
+ if name == 'main': unittest.main()
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -212,6 +212,9 @@ Core and Builtins Library ------- +- Issue #20804: The unittest.mock.sentinel attributes now preserve their