Ich habe eine Funktion in einem Modul, das eine argparse
erstellt:Python Unittest für 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()
Eine Probe myapp.py
wäre:
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
und dies wird als genannt werden:
$> python myapp.py -c config.yaml
$> config.yaml
127.0.0.1
Jetzt versuche ich einen Komponententest für diese Funktion zu erstellen, aber mein Problem ist, dass ich ' t übergeben Befehlszeilenparameter über Testcode.
# 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
Mein Problem ist, dass ich die Befehlszeilenargumente zu get_options()
übergeben müssen, aber ich weiß nicht, wie es richtig zu machen.
Erwartete richtiger Aufruf: (. -c config.yaml
sollte irgendwie in dem Test-Code übergeben werden) python mytest.py
Was ist "Arbeit"/jetzt nicht arbeiten:
python mytest.py -c config.yaml
ist auch nicht funktioniert. GibtAttributeError: 'module' object has no attribute 'config'
zurück, da erwartet wird, dass ichargParseTestCase
stattdessen anrufe. Mit anderen Worten,python mytest.py -c argParseTestCase
"funktioniert", würde aber natürlich eineAssertionError: 'config.yaml' != 'argParseTestCase'
python mytest.py -v
sein, um den Komponententest im ausführlichen Modus auszuführen, schlägt auch fehl. Es gibt:test_parser (main.argParseTestCase) ... mytest.py 1.0 ERROR ERROR: test_parser (main.argParseTestCase)
Traceback (most recent call last): File "tests/unit_tests/mytest.py", line 376, in test_parser options = get_options() File "/root/test/lib/python2.7/site-packages/mymodule.py", line 61, in get_options return parser.parse_args()
File "/usr/local/lib/python2.7/argparse.py", line 1701, in parse_args args, argv = self.parse_known_args(args, namespace)
File "/usr/local/lib/python2.7/argparse.py", line 1733, in parse_known_args namespace, args = self._parse_known_args(args, namespace)
File "/usr/local/lib/python2.7/argparse.py", line 1939, in _parse_known_args start_index = consume_optional(start_index)
File "/usr/local/lib/python2.7/argparse.py", line 1879, in consume_optional take_action(action, args, option_string)
File "/usr/local/lib/python2.7/argparse.py", line 1807, in take_action action(self, namespace, argument_values, option_string)
File "/usr/local/lib/python2.7/argparse.py", line 1022, in call parser.exit(message=formatter.format_help())
File "/usr/local/lib/python2.7/argparse.py", line 2362, in exit _sys.exit(status) SystemExit: 0