調用時在一個文件中(比如parser.py
)我有:argparse未能從單元測試測試
import argparse
def parse_cmdline(cmdline=None):
parser = argparse.ArgumentParser()
parser.add_argument('--first-param',help="Does foo.")
parser.add_argument('--second-param',help="Does bar.")
if cmdline is not None:
args = parser.parse_args(cmdline)
else:
args = parser.parse_args()
return vars(args)
if __name__=='__main__':
print parse_cmdline()
果然,從它的工作原理從命令行調用,當給我差不多就是我期望:
$ ./parser.py --first-param 123 --second-param 456
{'first_param': '123', 'second_param': '456'}
但後來我想unittest
它,所以我寫了test_parser.py
文件:
import unittest
from parser import parse_cmdline
class TestParser(unittest.TestCase):
def test_parse_cmdline(self):
parsed = parse_cmdline("--first-param 123 --second-param 456")
self.assertEqual(parsed['first_param'],'123')
self.assertEqual(parsed['second_param'],'456')
if __name__ == '__main__':
unittest.main()
然後我得到以下錯誤:
usage: test_parser.py [-h] [--first-param FIRST_PARAM]
[--second-param SECOND_PARAM]
test_parser.py: error: unrecognized arguments: - - f i r s t - p a r a m 1 2 3 - - s e c o n d - p a r a m 4 5 6
E
======================================================================
ERROR: test_parse_cmdline (__main__.TestParser)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./test_parser.py", line 8, in test_parse_cmdline
parsed = parse_cmdline("--first-param 123 --second-param 456")
File "/home/renan/test_argparse/parser.py", line 12, in parse_cmdline
args = parser.parse_args(cmdline)
File "/usr/lib/python2.7/argparse.py", line 1691, in parse_args
self.error(msg % ' '.join(argv))
File "/usr/lib/python2.7/argparse.py", line 2361, in error
self.exit(2, _('%s: error: %s\n') % (self.prog, message))
File "/usr/lib/python2.7/argparse.py", line 2349, in exit
_sys.exit(status)
SystemExit: 2
----------------------------------------------------------------------
Ran 1 test in 0.004s
FAILED (errors=1)
如可以看到的,我所指定的命令行(--first-param 123 --second-param 456
)成爲 - - f i r s t - p a r a m 1 2 3 - - s e c o n d - p a r a m 4 5 6
(每個字符由空格隔開)。
我不明白爲什麼:我做錯了什麼?
基於shlex的解決方案對我來說已經足夠好了。謝謝! – Renan
儘管考慮'split'和'shlex'的區別是很好的,它本身並不測試'arpgarse'。 'test_argparse.py'使用'split'很多,但不會導入'shlex'。如果參數中的空白很重要,我只會將'parse_args'提供給一個測試單詞列表。 – hpaulj