присваивать переменные argparse не через командную строку - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь написать тесты (используя pytest) для скрипта, но я не знаю, как создавать / передавать аргументы в main (), особенно когда он не получает аргументы. и даже если я изменю его на def main(args = None):, он будет инициирован в первой строке.

tests.py

def test_main(capfd):
    main()
    out, err = capfd.readouterr()
    assert out == "my expected output"

script.py

def init_parser():
    parser = argparse.ArgumentParser(description="The script searches one or \
                                     more named input files for lines \
                                     containing a match to a regular \
                                     expression pattern.")
    parser.add_argument('regex', help='the regular expression.')
    parser.add_argument('infile', nargs='*', type=argparse.FileType('r'), default=[sys.stdin],
                        help='the name of the file(s) to search.')
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-u', '--underscore', action='store_true', help='prints \
                       "^" under the matching text.')
    group.add_argument('-c', '--color', action='store_true', help='highlights \
                       matching text.')
    group.add_argument('-m', '--machine', action='store_true', help='generates \
                       machine readable output.')

    return parser


def main():
    args = init_parser().parse_args()
    for file in args.infile:
        for i, line in enumerate(iter(file.readline, '')):
            for substring in re.finditer(args.regex, line):
                    if args.underscore:
                        underscore_output(file.name, i + 1, line[:-1],
                                          substring.start(), substring.end())
                    elif args.color:
                        color_output(file.name, i + 1, line[:-1],
                                     substring.group())
                    elif args.machine:
                        machine_output(file.name, i + 1, substring.start(),
                                       substring.group())
                    else:
                        print_line(file.name, i + 1, line[:-1])```

Ответы [ 2 ]

1 голос
/ 31 мая 2019

parse_args может принять явный аргумент None, чтобы указать ему проанализировать sys.argv[1:].Напишите свой код, чтобы его можно было легко протестировать:

def main(args=None):
    args = init_parser().parse_args(args)
    ...

В производственном режиме вы будете вызывать main(), чтобы он мог проанализировать sys.argv.Для тестов вы передадите специфический набор аргументов.

def test_main(capfd):
    main(['[a-z]*', 'foo.txt', '-u'])  # For example
    out, err = capfd.readouterr()
    assert out == "my expected output"
0 голосов
/ 31 мая 2019

В тестовом коде вы должны исправить из sys.argv перед вызовом main:

def test_main(monkeypatch):
    monkeypatch.setattr("sys.argv", ["script.py", "test_regex", "test_infile"])
    main()
    # put your assertions here
...