2

我在让 docopt 将包含空格的参数解析为适当的字典对象以用于我的单元测试时遇到问题。

这是我目前用来构造参数列表以供 docopt 解析的代码:

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 像往常一样解析参数?

4

1 回答 1

3

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

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

因此,为了让您的测试正常工作,您应该传递一个列表而不是将其加入一个字符串argstr = ' '.join(testargs)中。

这种混淆可能是由于将字符串传递给 argv 是未记录的。事实上,它不是 API 的一部分,只是一个实现细节。您不应该依赖 docoptargv接受字符串这一事实——这可能会消失。但是,docopt 将始终接受argv.

于 2013-07-24T21:17:15.383 回答