Issue 20968. unittest.mock.MagicMock now supports division
diff --git a/NEWS b/NEWS
index d7a8af1..8fe2cf4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+- Issue #20968: unittest.mock.MagicMock now supports division.
+ Patch by Johannes Baiter.
+
- Issue #20189: unittest.mock now no longer assumes that any object for
which it could get an inspect.Signature is a callable written in Python.
Fix courtesy of Michael Foord.
diff --git a/mock.py b/mock.py
index 0c86d19..6a9c901 100644
--- a/mock.py
+++ b/mock.py
@@ -1765,7 +1765,11 @@
"trunc floor ceil "
)
-numerics = "add sub mul div floordiv mod lshift rshift and xor or pow "
+numerics = (
+ "add sub mul div floordiv mod lshift rshift and xor or pow"
+)
+if inPy3k:
+ numerics += ' truediv'
inplace = ' '.join('i%s' % n for n in numerics.split())
right = ' '.join('r%s' % n for n in numerics.split())
extra = ''
diff --git a/tests/testmagicmethods.py b/tests/testmagicmethods.py
index fa46330..ca67268 100644
--- a/tests/testmagicmethods.py
+++ b/tests/testmagicmethods.py
@@ -2,6 +2,8 @@
# E-mail: fuzzyman AT voidspace DOT org DOT uk
# http://www.voidspace.org.uk/python/mock/
+from __future__ import division
+
import unittest2 as unittest
from tests.support import inPy3k
@@ -149,32 +151,34 @@
self.assertEqual(7 + mock, mock)
self.assertEqual(mock.value, 16)
+ def test_division(self):
+ original = mock = Mock()
+ mock.value = 32
+ self.assertRaises(TypeError, lambda: mock / 2)
- @unittest.skipIf(inPy3k, 'no truediv in Python 3')
- def test_truediv(self):
- mock = MagicMock()
- mock.__truediv__.return_value = 6
+ def truediv(self, other):
+ mock.value /= other
+ return self
+ mock.__truediv__ = truediv
+ self.assertEqual(mock / 2, mock)
+ self.assertEqual(mock.value, 16)
- context = {'mock': mock}
- code = 'from __future__ import division\nresult = mock / 7\n'
- exec(code, context)
- self.assertEqual(context['result'], 6)
+ del mock.__truediv__
+ if inPy3k:
+ def itruediv(mock):
+ mock /= 4
+ self.assertRaises(TypeError, itruediv, mock)
+ mock.__itruediv__ = truediv
+ mock /= 8
+ self.assertEqual(mock, original)
+ self.assertEqual(mock.value, 2)
+ else:
+ mock.value = 2
- mock.__rtruediv__.return_value = 3
- code = 'from __future__ import division\nresult = 2 / mock\n'
- exec(code, context)
- self.assertEqual(context['result'], 3)
-
-
- @unittest.skipIf(not inPy3k, 'truediv is available in Python 2')
- def test_no_truediv(self):
- self.assertRaises(
- AttributeError, getattr, MagicMock(), '__truediv__'
- )
- self.assertRaises(
- AttributeError, getattr, MagicMock(), '__rtruediv__'
- )
-
+ self.assertRaises(TypeError, lambda: 8 / mock)
+ mock.__rtruediv__ = truediv
+ self.assertEqual(0.5 / mock, mock)
+ self.assertEqual(mock.value, 4)
def test_hash(self):
mock = Mock()