# HG changeset patch # Parent 64485e0700baa09df15aa4075c2bbba588fd8305 diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -1056,12 +1056,18 @@ standardMsg = 'unexpectedly None' self.fail(self._formatMessage(msg, standardMsg)) - def assertIsInstance(self, obj, cls, msg=None): + def assertIsInstance(self, obj, cls, msg=None, exact_type=None): """Same as self.assertTrue(isinstance(obj, cls)), with a nicer default message.""" if not isinstance(obj, cls): standardMsg = '%s is not an instance of %r' % (safe_repr(obj), cls) self.fail(self._formatMessage(msg, standardMsg)) + if exact_type: + if isinstance(exact_type, type): + cls = exact_type + if type(obj) is not cls: + standardMsg = 'type of %s is not %r' % (safe_repr(obj), cls) + self.fail(self._formatMessage(msg, standardMsg)) def assertNotIsInstance(self, obj, cls, msg=None): """Included for symmetry with assertIsInstance.""" diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -493,9 +493,17 @@ def testAssertIsInstance(self): thing = [] + Duck = type('Duck', (list,), {}) + duck = Duck() self.assertIsInstance(thing, list) + self.assertIsInstance(thing, list, exact_type=True) + self.assertIsInstance(duck, list) + self.assertIsInstance(duck, list, exact_type=Duck) + self.assertRaises(self.failureException, self.assertIsInstance, thing, dict) + self.assertRaises(self.failureException, self.assertIsInstance, + duck, list, exact_type=True) def testAssertNotIsInstance(self): thing = []