2016-10-04 2 views
0

У меня есть main функцию, заданных в качестве точки входа в setup.py моего пакета, который использует argparse пакета для того, чтобы передать аргументы командной строки (см discussion here):Как установить argparse аргументов из питона сценария

# file with main routine specified as entry point in setup.py 
import argparse 
def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('a', type=str, help='mandatory argument a') 
    args = parser.parse_args() 

В идеале, Я хотел бы использовать ту же функцию main в тестах пакета, как предложено here. В последнем контексте я хотел бы вызвать функцию main из тестового класса и задать (некоторые из) аргументы командной строки перед вызовом функции (что в противном случае завершится неудачно из-за отсутствующих аргументов).

# file in the tests folder calling the above main function 
class TestConsole(TestCase): 
    def test_basic(self): 
     set_value_of_a() 
     main() 

Возможно ли это?

+0

Почему вы не добавляете 'kwargs' в' main', и только если они 'None', вы устанавливаете их в' parse_args'? –

+0

@ Виллиам Фернандес Великий, спасибо !!! – XabiFermal

ответ

2

argparse модуль фактически считывает входные переменные из специальной переменной, которая называется ARGV (сокращенно от ARG ument V Ector). К этой переменной обычно обращаются, читая sys.argv от sys модуль.

Эта переменная является обычный список, так что вы можете добавить свои параметры командной строки, это так:

import sys 
sys.argv.extend(['-a', SOME_VALUE]) 
main() 

Однако баловаться с sys.argv во время выполнения не является хорошим способом тестирования. Гораздо чище способ заменить sys.argv в течение некоторого ограниченного объема использует unittest.mock.patch контекста менеджера, например:

with unittest.mock.patch('sys.argv'. ['-a', SOME_VALUE]): 
    main() 

Read more about unittest.mock.patch in documentation

Кроме того, проверить это SO вопрос:

How do I set sys.argv so I can unit test it?

0

Добавить kwargs в main, и если они None, вы установите их на parse_args.

0

@William Fernandes: Просто для полноты картины, я выложу полное решение в способе, которым было предложено (проверка на пустой Словаре не kwargs is None):

def main(**kwargs): 
    a = None 
    if not kwargs: 
     parser = argparse.ArgumentParser() 
     parser.add_argument('a', type=str, help='mandatory argument a') 
     args = parser.parse_args() 
     a = args.a 
    else: 
     a = kwargs.get('a') 

    print(a) 

Изнутри теста класс функция main может быть вызвана с аргументами:

# file in the tests folder calling the above main function 
class TestConsole(TestCase): 
    def test_basic(self): 
     main(a=42) 

вызов из командной строки без kwargs затем требует задания аргумента командной строки a=....

Смежные вопросы