Сделайте 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
,