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()