"аргументаційна частина" трохи розпливчаста, тому ця відповідь зосереджена на одній частині: parse_args
методі. Це метод, який взаємодіє з вашим командним рядком і отримує всі передані значення. В основному, ви можете знущатися над тим, що parse_args
повертається, щоб не потрібно було насправді отримувати значення з командного рядка. mock
Пакет може бути встановлений через піп для пітона версії 2,6-3,2. Це частина стандартної бібліотеки починаючи unittest.mock
з версії 3.3.
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
. (див. документи ) Цей стиль корисний для швидкого тестування у випадках, коли для кожного аргументу методу передаються різні значення. Якщо ви вирішили знущатися над Namespace
самим повним невиконанням аргументів у своїх тестах, переконайтеся, що він поводиться аналогічно фактичному Namespace
класу.
Нижче наводиться приклад використання першого фрагмента з бібліотеки argparse.
# 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())