„część argparse” jest nieco niejasna, więc ta odpowiedź skupia się na jednej części: parse_args
metodzie. Jest to metoda, która współdziała z wierszem poleceń i pobiera wszystkie przekazane wartości. Zasadniczo można kpić z tego, co parse_args
zwraca, aby nie musiało faktycznie pobierać wartości z wiersza poleceń. mock
Pakiet można zainstalować poprzez pip dla wersji Pythona 2.6-3.2. Jest częścią biblioteki standardowej począwszy unittest.mock
od wersji 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
Musisz uwzględnić wszystkie argumenty metody poleceń, Namespace
nawet jeśli nie zostały one przekazane. Nadaj tym argumentom wartość None
. (zobacz dokumentację ) Ten styl jest przydatny do szybkiego testowania przypadków, w których dla każdego argumentu metody przekazywane są różne wartości. Jeśli zdecydujesz się kpić z Namespace
samego siebie, aby w testach całkowicie nie polegać na argparse, upewnij się, że zachowuje się podobnie do rzeczywistej Namespace
klasy.
Poniżej znajduje się przykład wykorzystujący pierwszy fragment z biblioteki 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())