“argparse 部分”有点模糊,所以这个答案集中在一个部分:parse_args 方法。这是与您的命令行交互并获取所有传递值的方法。基本上,您可以模拟 parse_args 返回的内容,这样它就不需要从命令行实际获取值。 mock package 可以通过 pip 安装用于 python 版本 2.6-3.2。从 3.3 版开始,它作为 unittest.mock 成为标准库的一部分。
import argparse
try:
from unittest import mock # python 3.3+
except ImportError:
import mock # python 2.6-3.2
@mock.patch('argparse.ArgumentParser.parse_args',
return_value=argparse.Namespace(kwarg1=value, kwarg2=value))
def test_command(mock_args):
pass
您必须在Namespace 中包含所有命令方法的参数,即使它们没有通过。给这些参数一个值None。 (参见docs)这种风格对于快速测试为每个方法参数传递不同值的情况很有用。如果您选择模拟 Namespace 本身以在您的测试中完全不依赖 argparse,请确保它的行为类似于实际的 Namespace 类。
以下是使用 argparse 库中的第一个 sn-p 的示例。
# test_mock_argparse.py
import argparse
try:
from unittest import mock # python 3.3+
except ImportError:
import mock # python 2.6-3.2
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args) # NOTE: this is how you would check what the kwargs are if you're unsure
return args.accumulate(args.integers)
@mock.patch('argparse.ArgumentParser.parse_args',
return_value=argparse.Namespace(accumulate=sum, integers=[1,2,3]))
def test_command(mock_args):
res = main()
assert res == 6, "1 + 2 + 3 = 6"
if __name__ == "__main__":
print(main())