юнит-тест python для argparse

У меня есть функция внутри модуля, который создаетargparse:

def get_options(prog_version='1.0', prog_usage='', misc_opts=None):
     options = [] if misc_opts is None else misc_opts
     parser = ArgumentParser(usage=prog_usage) if prog_usage else ArgumentParser()
     parser.add_argument('-v', '--version', action='version', version='%(prog)s {}'.format(prog_version))
     parser.add_argument('-c', '--config', dest='config', required=True, help='the path to the configuration file')

    for option in options:
        if 'option' in option and 'destination' in option:
            parser.add_argument(option['option'],
                                dest=option.get('destination', ''),
                                default=option.get('default', ''),
                                help=option.get('description', ''),
                                action=option.get('action', 'store'))

    return parser.parse_args()

Образецmyapp.py было бы:

my_options = [
    {
        "option": "-s",
        "destination": "remote_host",
        "default": "127.0.0.1",
        "description": "The remote server name or IP address",
        "action": "store"
    },
]

# Get Command Line Options
options = get_options(misc_opts=my_options)
print options.config
print options.remote_host

и это будет называться как:

$> python myapp.py -c config.yaml
$> config.yaml
   127.0.0.1
gt; python myapp.py -c config.yaml
$> python myapp.py -c config.yaml
$> config.yaml
   127.0.0.1
gt; config.yaml 127.0.0.1

Сейчас я пытаюсь создать модульный тест для этой функции, но моя проблема в том, что я не могу передать параметры командной строки через тестовый код.

# mytest.py
import unittest
from mymodule import get_options

class argParseTestCase(unittest.TestCase):
     def test_parser(self):
         options = get_options()
         # ...pass the command line arguments...
         self.assertEquals('config.yaml', options.config) # ofcourse this fails because I don't know how I will pass the command line arguments

Моя проблема в том, что мне нужно передать аргументы командной строкиget_options() но я не знаю, как это сделать правильно.

Ожидаемый правильный звонок:python mytest.py (-c config.yaml нужно как-то пройти внутри тестового кода.)

Что "работает" / не работает прямо сейчас:

python mytest.py -c config.yaml тоже не работает. ВозвращаетAttributeError: 'module' object has no attribute 'config' так как он ожидает, что я позвонюargParseTestCase вместо. Другими словами,python mytest.py -c argParseTestCase "работает", но, конечно, будет возвращениеAssertionError: 'config.yaml' != 'argParseTestCase'

python mytest.py -v запустить юнит-тест в подробном режиме также не удается. Возвращает:

test_parser (главный.argParseTestCase) ... mytest.py 1.0 ОШИБКА ОШИБКИ: test_parser (главный.argParseTestCase)
Traceback (последний вызов был последним): файл "tests / unit_tests / mytest.py", строка 376, в параметрах test_parser = get_options () Файл "/root/test/lib/python2.7/site-packages/mymodule.py" строка 61, в get_options возвращает parser.parse_args ()
Файл "/usr/local/lib/python2.7/argparse.py", строка 1701, в аргументах parse_args, argv = self.parse_known_args (аргументы, пространство имен)
Файл "/usr/local/lib/python2.7/argparse.py", строка 1733, в пространстве имен parse_known_args, args = self._parse_known_args (args, пространство имен)
Файл "/usr/local/lib/python2.7/argparse.py", строка 1939, в _parse_known_args start_index = потребление_опциональное (start_index)
Файл "/usr/local/lib/python2.7/argparse.py", строка 1879, в take_optional take_action (action, args, option_string)
Файл "/usr/local/lib/python2.7/argparse.py", строка 1807, в действии take_action (self, пространство имен, arguments_values, option_string)
Файл "/usr/local/lib/python2.7/argparse.py", строка 1022, ввызов parser.exit (сообщение = formatter.format_help ())
Файл "/usr/local/lib/python2.7/argparse.py", строка 2362, на выходе _sys.exit (status) SystemExit: 0

Ответы на вопрос(2)

Ваш ответ на вопрос