Сделайте docopt разбирает аргументы, содержащие пробелы в модульных тестах

У меня возникают проблемы с получением 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 анализировал аргументы, как обычно?

1 ответ

Решение

Докопт берет argv параметр в виде строки или списка.

  • Если это список, он будет интерпретировать каждый элемент списка как отдельный аргумент.
  • Если это строка, она разделит строку на список, используя .split(), Таким образом, вы теряете все пустое пространство.

Итак, чтобы ваш тест работал, вы должны передать список вместо того, чтобы соединить его в строку argstr = ' '.join(testargs),

Эта путаница, вероятно, связана с тем, что передача строки в argv недокументирована. На самом деле это не часть API, а просто деталь реализации. Не стоит полагаться на то, что докопт argv берет строку - это может уйти. Однако docopt всегда будет принимать список для argv,

Другие вопросы по тегам