«argparse part» немного расплывчатый, поэтому этот ответ фокусируется на одной части: 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())