Closes Issue 21238: New keyword argument `unsafe` to Mock.

It raises `AttributeError` incase of an attribute startswith assert
or assret.
diff --git a/NEWS b/NEWS
index e84f59d..ab79a62 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+- Issue #21238: New keyword argument `unsafe` to Mock. It raises
+  `AttributeError` incase of an attribute startswith assert or assret.
+
 - Issue #21239: patch.stopall() didn't work deterministically when the same
   name was patched more than once.
 
diff --git a/mock.py b/mock.py
index 3940ba7..b55dc1e 100644
--- a/mock.py
+++ b/mock.py
@@ -508,7 +508,7 @@
     def __init__(
             self, spec=None, wraps=None, name=None, spec_set=None,
             parent=None, _spec_state=None, _new_name='', _new_parent=None,
-            _spec_as_instance=False, _eat_self=None, **kwargs
+            _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs
         ):
         if _new_parent is None:
             _new_parent = parent
@@ -538,6 +538,7 @@
         __dict__['_mock_mock_calls'] = _CallList()
 
         __dict__['method_calls'] = _CallList()
+        __dict__['_mock_unsafe'] = unsafe
 
         if kwargs:
             self.configure_mock(**kwargs)
@@ -694,13 +695,16 @@
 
 
     def __getattr__(self, name):
-        if name == '_mock_methods':
+        if name in {'_mock_methods', '_mock_unsafe'}:
             raise AttributeError(name)
         elif self._mock_methods is not None:
             if name not in self._mock_methods or name in _all_magics:
                 raise AttributeError("Mock object has no attribute %r" % name)
         elif _is_magic(name):
             raise AttributeError(name)
+        if not self._mock_unsafe:
+            if name.startswith(('assert', 'assret')):
+                raise AttributeError(name)
 
         result = self._mock_children.get(name)
         if result is _deleted:
diff --git a/tests/testmock.py b/tests/testmock.py
index 5ab845e..b5d7542 100644
--- a/tests/testmock.py
+++ b/tests/testmock.py
@@ -1251,6 +1251,17 @@
         m = mock.create_autospec(object(), name='sweet_func')
         self.assertIn('sweet_func', repr(m))
 
+    #Issue21238
+    def test_mock_unsafe(self):
+        m = Mock()
+        with self.assertRaises(AttributeError):
+            m.assert_foo_call()
+        with self.assertRaises(AttributeError):
+            m.assret_foo_call()
+        m = Mock(unsafe=True)
+        m.assert_foo_call()
+        m.assret_foo_call()
+
     def test_mock_add_spec(self):
         class _One(object):
             one = 1