我遇到问题,让docopt将包含空格的参数解析为适当的字典对象,以便与我的单元测试一起使用。
这是我正在使用的代码,用于构造docopt to parse的参数列表:
testargs = []
def clear_args():
testargs[:] = []
return
def add_testfiles(file1='defaultfile1.txt', file2='defaultfile2.txt'):
clear_args()
testargs.append('--debug')
testargs.append(file1)
testargs.append(file2)
return
def parse_args(optlist):
argstr = ' '.join(optlist)
return docopt(downpost.__doc__, argv=argstr)
我正在编写单元测试的代码有2个测试,它们分别给出以下参数:
-t <title> # <title> can be any string (with spaces) inside quotation marks
"A Filename with Spaces.txt" # any filename as long as it's in quotation marks
例如,要添加-t参数,我会这样做:
def test_exampleunittest(self):
add_testfiles()
testargs.append('-t "This is the title I want"')
self.args = parse_args(testargs)
self.post = myPythonScript.process(self.args)
self.assertEqual(self.post['Subject'], 'This is the title I want')
如果我运行脚本我自己用上述参数进行测试,它们会被接受而没有任何问题,并且输出是预期的。
但是,如果我运行使用包含空格的参数的单元测试,我会得到以下结果:
DocoptExit: Usage: myPythonScript [options] <file_1> <file_2>
需要相同dict对象(包含相同参数)的其他单元测试工作正常。
我应该在代码中更改什么才能使docopt像往常一样解析参数?
答案 0 :(得分:2)
docopt将argv
参数作为字符串或列表。
.split()
将字符串拆分为列表。这样你就可以松开所有的空白。因此,为了使您的测试有效,您应该传递一个列表,而不是将其加入字符串argstr = ' '.join(testargs)
。
这种混淆可能是因为将字符串传递给argv是未记录的。实际上它不是API的一部分,只是一个实现细节。你不应该依赖docopt argv
采用字符串的事实 - 这可能会消失。但是,docopt将始终接受argv
的列表。