python unittest para argparse
Eu tenho uma função dentro de um módulo que cria umargparse
:
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()
Uma amostramyapp.py
seria:
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
e isso será chamado como:
$> 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
Agora, estou tentando criar um teste de unidade para esta função, mas meu problema é que não consigo passar parâmetros de linha de comando via código de teste.
# 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
Meu problema é que preciso passar os argumentos da linha de comando paraget_options()
mas não sei como fazer isso corretamente.
Chamada adequada esperada:python mytest.py
(-c config.yaml
deve ser passado dentro do código de teste de alguma forma.)
O que está "funcionando" / não está funcionando no momento:
python mytest.py -c config.yaml
também não está funcionando. DevoluçõesAttributeError: 'module' object has no attribute 'config'
pois espera que eu ligueargParseTestCase
em vez de. Em outras palavras,python mytest.py -c argParseTestCase
"funciona", mas é claro que seria um retornoAssertionError: 'config.yaml' != 'argParseTestCase'
python mytest.py -v
executar o teste de unidade no modo detalhado também falha. Retorna:
test_parser (a Principal.argParseTestCase) ... mytest.py 1.0 ERRO ERRO: test_parser (a Principal.argParseTestCase)
Traceback (última chamada mais recente): arquivo "tests / unit_tests / mytest.py", linha 376, nas opções test_parser = get_options () Arquivo "/root/test/lib/python2.7/site-packages/mymodule.py" , linha 61, em get_options, retorne parser.parse_args ()
Arquivo "/usr/local/lib/python2.7/argparse.py", linha 1701, em parse_args args, argv = self.parse_known_args (args, espaço para nome)
Arquivo "/usr/local/lib/python2.7/argparse.py", linha 1733, no espaço para nome parse_known_args, args = self._parse_known_args (args, espaço para nome)
Arquivo "/usr/local/lib/python2.7/argparse.py", linha 1939, em _parse_known_args start_index = consume_optional (start_index)
Arquivo "/usr/local/lib/python2.7/argparse.py", linha 1879, em take_action consuma_optional (action, args, option_string)
Arquivo "/usr/local/lib/python2.7/argparse.py", linha 1807, na ação take_action (self, namespace, argument_values, option_string)
O arquivo "/usr/local/lib/python2.7/argparse.py", linha 1022, emligar parser.exit (mensagem = formatter.format_help ())
Arquivo "/usr/local/lib/python2.7/argparse.py", linha 2362, na saída _sys.exit (status) SystemExit: 0