[Tutor] doctest question

Albert-Jan Roskam fomcl at yahoo.com
Mon Nov 26 22:06:19 CET 2012


Hi,

I am using doctest and I am struggling with newlines characters (see below). One is the newline escape (backslash)
for a long dictionary definition. The other is an embedded \n in the output. I used the +NORMALIZE_WHITESPACE
directive. I also tried using a triple-quoted raw docstring. Any ideas?

While we're at it: is this a good book? http://www.packtpub.com/python-testing-beginners-guide/book
It should be complete, not too shallow, nor so detailed that is becomes too impractical.

Thanks!


import doctest
import copy

def _setMultRespDefsEx(multRespDefs):
        """>>> multRespDefs = {'mesetx': {'countedValue': '1', 'firstVarIsLabel': True, \
               'label': '', 'setType': 'E','varNames':  ['mevar1', 'mevar2', \
               'var3']}, 'mesety': {'countedValue': 'Yes', 'firstVarIsLabel': \
               False, 'label': 'Enhanced set with user specified label', \
               'setType': 'E', 'varNames': ['mevar4', 'mevar5', 'mevar6']}}
        >>> _setMultRespDefsEx(multRespDefs)
        $mesetx=E 11 1 1 0 mevar1 mevar2 mevar3
        $mesety=E 1 3 Yes 38 Enhanced set with user specified label mevar4 mevar5 mevar6
        # doctest: +NORMALIZE_WHITESPACE"""
        mrDefs = []
        for setName, rest in multRespDefs.iteritems():
            if rest["setType"] != "E":
                return {}
            rest["setName"] = setName
            v = int(rest["firstVarIsLabel"])
            rest["firstVarIsLabel"] = v if v == 1 else ""
            rest["valueLen"] = len(rest["countedValue"])
            rest["lblLen"] = len(rest["label"])
            rest["label"] = rest["label"]
            rest["varNames"] = " ".join(rest["varNames"])
            mrDef =  "$%(setName)s=%(setType)s 1%(firstVarIsLabel)s %(valueLen)s "
            mrDef += "%(countedValue)s %(lblLen)s %(label)s %(varNames)s"
            mrDefs.append((mrDef % rest).replace("  ", " "))
        return "\n".join(mrDefs)

if __name__ == "__main__":
    x = {"setType": "E", "label": "Enhanced set with user specified label",
         "varNames": ["mevar4", "mevar5", "mevar6"], "countedValue":
         "Yes", "firstVarIsLabel": False}

    d = {'testme': copy.deepcopy(x), 'testmeMore': copy.deepcopy(x)}
    print _setMultRespDefsEx(d) # prints desired result
    doctest.testmod() # fails because of newline! See below

**********************************************************************
File "__main__", line 3, in __main__._setMultRespDefsEx
Failed example:
    _setMultRespDefsEx(multRespDefs)
Expected:
    $mesetx=E 11 1 1 0 mevar1 mevar2 mevar3
    $mesety=E 1 3 Yes 38 Enhanced set with user specified label mevar4 mevar5 mevar6
    # doctest: +NORMALIZE_WHITESPACE
Got:
    mesetx {'countedValue': '1', 'firstVarIsLabel': True, 'setType': 'E', 'varNames': ['mevar1', 'mevar2', 'var3'], 'label': ''}
    mesety {'countedValue': 'Yes', 'firstVarIsLabel': False, 'setType': 'E', 'varNames': ['mevar4', 'mevar5', 'mevar6'], 'label': 'Enhanced set with user specified label'}
    '$mesetx=E 11 1 1 0 mevar1 mevar2 var3\n$mesety=E 1 3 Yes 38 Enhanced set with user specified label mevar4 mevar5 mevar6'
**********************************************************************
1 items had failures:
   1 of   2 in __main__._setMultRespDefsEx
***Test Failed*** 1 failures.

**********************************************************************
1st error with r-escaped docstring

**********************************************************************
File "__main__", line 5, in __main__._setMultRespDefsEx
Failed example:
    multRespDefs = {'mesetx': {'countedValue': '1', 'firstVarIsLabel': True, \
Exception raised:
    Traceback (most recent call last):
      File "C:\Python26\lib\doctest.py", line 1241, in __run
        compileflags, 1) in test.globs
      File "<doctest __main__._setMultRespDefsEx[0]>", line 1
         multRespDefs = {'mesetx': {'countedValue': '1', 'firstVarIsLabel': True, \
                                                                                  
    ^
     SyntaxError: unexpected EOF while parsing
*****************************************************


More information about the Tutor mailing list