[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