diff --git a/django/test/testcases.py b/django/test/testcases.py index 3c851f4bd4..dcab078553 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -58,19 +58,10 @@ class OutputChecker(doctest.OutputChecker): Based on http://codespeak.net/svn/lxml/trunk/src/lxml/doctestcompare.py """ - - # We use this to distinguish the output of repr() from an XML element: - _repr_re = re.compile(r'^<[^>]+ (at|object) ') - _norm_whitespace_re = re.compile(r'[ \t\n][ \t\n]+') def norm_whitespace(v): return _norm_whitespace_re.sub(' ', v) - def looks_like_xml(s): - s = s.strip() - return (s.startswith('<') - and not _repr_re.search(s)) - def child_text(element): return ''.join([c.data for c in element.childNodes if c.nodeType == Node.TEXT_NODE]) @@ -104,12 +95,14 @@ class OutputChecker(doctest.OutputChecker): want, got = self._strip_quotes(want, got) want = want.replace('\\n','\n') got = got.replace('\\n','\n') - - # If what we want doesn't look like markup, don't bother trying - # to parse it. - if not looks_like_xml(want): - return False + # If the string is not a complete xml document, we may need to add a + # root element. This allow us to compare fragments, like "" + if not want.startswith('%s' + want = wrapper % want + got = wrapper % got + # Parse the want and got strings, and compare the parsings. try: want_root = parseString(want).firstChild diff --git a/tests/regressiontests/test_utils/tests.py b/tests/regressiontests/test_utils/tests.py index 9deb60b2ca..2f950bef10 100644 --- a/tests/regressiontests/test_utils/tests.py +++ b/tests/regressiontests/test_utils/tests.py @@ -29,6 +29,16 @@ r""" ... xml.endDocument() ... return stream.getvalue() +>>> def produce_xml_fragment(): +... stream = StringIO() +... xml = SimplerXMLGenerator(stream, encoding='utf-8') +... xml.startElement("foo", {"aaa" : "1.0", "bbb": "2.0"}) +... xml.characters("Hello") +... xml.endElement("foo") +... xml.startElement("bar", {}) +... xml.endElement("bar") +... return stream.getvalue() + # Long values are normalized and are comparable to normal integers ... >>> produce_long() 42 @@ -53,5 +63,10 @@ r""" >>> produce_xml() '\nHelloGoodbye' +>>> produce_xml_fragment() +'Hello' + +>>> produce_xml_fragment() +'Hello' """ \ No newline at end of file