Commit 674648e3 authored by Michael Foord's avatar Michael Foord

unittest.TestCase.assertDictEqual and assertMultilineEqual provide better...

unittest.TestCase.assertDictEqual and assertMultilineEqual provide better default failure messages in the event of long diffs.
parent 77acee95
...@@ -800,10 +800,11 @@ class TestCase(object): ...@@ -800,10 +800,11 @@ class TestCase(object):
self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary') self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
if d1 != d2: if d1 != d2:
standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True))
diff = ('\n' + '\n'.join(difflib.ndiff( diff = ('\n' + '\n'.join(difflib.ndiff(
pprint.pformat(d1).splitlines(), pprint.pformat(d1).splitlines(),
pprint.pformat(d2).splitlines()))) pprint.pformat(d2).splitlines())))
standardMsg = self._truncateMessage('', diff) standardMsg = self._truncateMessage(standardMsg, diff)
self.fail(self._formatMessage(msg, standardMsg)) self.fail(self._formatMessage(msg, standardMsg))
def assertDictContainsSubset(self, expected, actual, msg=None): def assertDictContainsSubset(self, expected, actual, msg=None):
...@@ -886,9 +887,10 @@ class TestCase(object): ...@@ -886,9 +887,10 @@ class TestCase(object):
'Second argument is not a string')) 'Second argument is not a string'))
if first != second: if first != second:
standardMsg = '%s != %s' % (safe_repr(d1, True), safe_repr(d2, True))
diff = '\n' + ''.join(difflib.ndiff(first.splitlines(True), diff = '\n' + ''.join(difflib.ndiff(first.splitlines(True),
second.splitlines(True))) second.splitlines(True)))
standardMsg = self._truncateMessage('', diff) standardMsg = self._truncateMessage(standardMsg, diff)
self.fail(self._formatMessage(msg, standardMsg)) self.fail(self._formatMessage(msg, standardMsg))
def assertLess(self, a, b, msg=None): def assertLess(self, a, b, msg=None):
......
...@@ -2,12 +2,16 @@ ...@@ -2,12 +2,16 @@
__unittest = True __unittest = True
_MAX_LENGTH = 80
def safe_repr(obj): def safe_repr(obj, short=False):
try: try:
return repr(obj) result = repr(obj)
except Exception: except Exception:
return object.__repr__(obj) result = object.__repr__(obj)
if not short or len(result) < _MAX_LENGTH:
return result
return result[:_MAX_LENGTH] + ' [truncated]...'
def strclass(cls): def strclass(cls):
return "%s.%s" % (cls.__module__, cls.__name__) return "%s.%s" % (cls.__module__, cls.__name__)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment