From f2dfef1637706e2d103151f1d333b33fc26018b0 Mon Sep 17 00:00:00 2001 From: Michael Foord Date: Sun, 5 Apr 2009 19:19:28 +0000 Subject: [PATCH] Adding assertIs and assertIsNot methods to unittest.TestCase Issue #2578 --- Doc/library/unittest.rst | 17 +++++++++++++++++ Lib/test/test_unittest.py | 23 +++++++++++++++++++++++ Lib/unittest.py | 12 ++++++++++++ Misc/NEWS | 2 ++ 4 files changed, 54 insertions(+) diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index 38e4239a2c3..4f4459cf411 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -859,6 +859,23 @@ Test cases .. versionadded:: 2.7 + .. method:: assertIs(expr1, expr2[, msg]) + + This signals a test failure if *expr1* and *expr2* don't evaluate to the same + object. + + .. versionadded:: 2.7 + + + .. method:: assertIsNot(expr1, expr2[, msg]) + + The inverse of the :meth:`assertIs` method. + This signals a test failure if *expr1* and *expr2* evaluate to the same + object. + + .. versionadded:: 2.7 + + .. method:: assertFalse(expr[, msg]) failIf(expr[, msg]) diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 38c4f8f41d0..f28b1af988b 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -2301,6 +2301,16 @@ class Test_TestCase(TestCase, TestEquality, TestHashing): # from this TestCase instance but since its a local nothing else # will ever notice that. + def testAssertIs(self): + thing = object() + self.assertIs(thing, thing) + self.assertRaises(self.failureException, self.assertIs, thing, object()) + + def testAssertIsNot(self): + thing = object() + self.assertIsNot(thing, object()) + self.assertRaises(self.failureException, self.assertIsNot, thing, thing) + def testAssertIn(self): animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'} @@ -2444,6 +2454,7 @@ class Test_TestCase(TestCase, TestEquality, TestHashing): # Test that sequences of unhashable objects can be tested for sameness: self.assertSameElements([[1, 2], [3, 4]], [[3, 4], [1, 2]]) + self.assertSameElements([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}]) self.assertRaises(self.failureException, self.assertSameElements, [[1]], [[2]]) @@ -3016,6 +3027,18 @@ class TestLongMessage(TestCase): "^unexpectedly None$", "^unexpectedly None : oops$"]) + def testAssertIs(self): + self.assertMessages('assertIs', (None, 'foo'), + ["^None is not 'foo'$", "^oops$", + "^None is not 'foo'$", + "^None is not 'foo' : oops$"]) + + def testAssertIsNot(self): + self.assertMessages('assertIsNot', (None, None), + ["^unexpectedly identical: None$", "^oops$", + "^unexpectedly identical: None$", + "^unexpectedly identical: None : oops$"]) + ###################################################################### ## Main diff --git a/Lib/unittest.py b/Lib/unittest.py index 83790fce703..f99f958d913 100644 --- a/Lib/unittest.py +++ b/Lib/unittest.py @@ -806,6 +806,18 @@ class TestCase(object): standardMsg = '%r unexpectedly found in %r' % (member, container) self.fail(self._formatMessage(msg, standardMsg)) + def assertIs(self, expr1, expr2, msg=None): + """Just like self.assertTrue(a is b), but with a nicer default message.""" + if expr1 is not expr2: + standardMsg = '%r is not %r' % (expr1, expr2) + self.fail(self._formatMessage(msg, standardMsg)) + + def assertIsNot(self, expr1, expr2, msg=None): + """Just like self.assertTrue(a is not b), but with a nicer default message.""" + if expr1 is expr2: + standardMsg = 'unexpectedly identical: %r' % (expr1,) + self.fail(self._formatMessage(msg, standardMsg)) + def assertDictEqual(self, d1, d2, msg=None): self.assert_(isinstance(d1, dict), 'First argument is not a dictionary') self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary') diff --git a/Misc/NEWS b/Misc/NEWS index 2cfd2922b77..fb5351a95ae 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -212,6 +212,8 @@ Core and Builtins Library ------- +- Issue 5693: TestSuite.__iter__ can now be consistently overridden in subclasses. + - Issue 5694: removed spurious test output in Distutils (test_clean). - Issue 5471: Fix os.path.expanduser() for $HOME set to '/'.