在单元测试中创建包含空格的docopt解析参数

时间:2013-07-23 12:59:33

标签: python python-2.7 docopt

我遇到问题,让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像往常一样解析参数?

1 个答案:

答案 0 :(得分:2)

docopt将argv参数作为字符串或列表。

  • 如果是列表,它会将列表中的每个项目解释为单独的参数。
  • 如果是字符串,则会使用.split()将字符串拆分为列表。这样你就可以松开所有的空白。

因此,为了使您的测试有效,您应该传递一个列表,而不是将其加入字符串argstr = ' '.join(testargs)

这种混淆可能是因为将字符串传递给argv是未记录的。实际上它不是API的一部分,只是一个实现细节。你不应该依赖docopt argv采用字符串的事实 - 这可能会消失。但是,docopt将始终接受argv的列表。