mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
Issue #15836: assertRaises(), assertRaisesRegex(), assertWarns() and
assertWarnsRegex() assertments now check the type of the first argument to prevent possible user error. Based on patch by Daniel Wagner-Hall.
This commit is contained in:
parent
ff54223606
commit
041dd8eef1
5 changed files with 74 additions and 1 deletions
|
@ -119,6 +119,10 @@ def expectedFailure(test_item):
|
|||
test_item.__unittest_expecting_failure__ = True
|
||||
return test_item
|
||||
|
||||
def _is_subtype(expected, basetype):
|
||||
if isinstance(expected, tuple):
|
||||
return all(_is_subtype(e, basetype) for e in expected)
|
||||
return isinstance(expected, type) and issubclass(expected, basetype)
|
||||
|
||||
class _BaseTestCaseContext:
|
||||
|
||||
|
@ -148,6 +152,9 @@ class _AssertRaisesBaseContext(_BaseTestCaseContext):
|
|||
If args is not empty, call a callable passing positional and keyword
|
||||
arguments.
|
||||
"""
|
||||
if not _is_subtype(self.expected, self._base_type):
|
||||
raise TypeError('%s() arg 1 must be %s' %
|
||||
(name, self._base_type_str))
|
||||
if args and args[0] is None:
|
||||
warnings.warn("callable is None",
|
||||
DeprecationWarning, 3)
|
||||
|
@ -172,6 +179,9 @@ class _AssertRaisesBaseContext(_BaseTestCaseContext):
|
|||
class _AssertRaisesContext(_AssertRaisesBaseContext):
|
||||
"""A context manager used to implement TestCase.assertRaises* methods."""
|
||||
|
||||
_base_type = BaseException
|
||||
_base_type_str = 'an exception type or tuple of exception types'
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
|
@ -206,6 +216,9 @@ class _AssertRaisesContext(_AssertRaisesBaseContext):
|
|||
class _AssertWarnsContext(_AssertRaisesBaseContext):
|
||||
"""A context manager used to implement TestCase.assertWarns* methods."""
|
||||
|
||||
_base_type = Warning
|
||||
_base_type_str = 'a warning type or tuple of warning types'
|
||||
|
||||
def __enter__(self):
|
||||
# The __warningregistry__'s need to be in a pristine state for tests
|
||||
# to work properly.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue