Pytest фиктивная глобальная переменная в subprocess.call () - PullRequest
0 голосов
/ 03 ноября 2018

Глобальная переменная может быть легко смоделирована после этих ответов . Отлично. Однако это не работает при попытке смоделировать переменную в скрипте, который вы вызываете с помощью subprocess.call() в тесте с Pytest.

Вот мой упрощенный скрипт в файле с именем so_script.py:

import argparse

INCREMENTOR = 4


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('input_nr', type=int, help='An int to increment')
    args = parser.parse_args()

    with open('test.txt', 'w+') as f:
        f.write(str(args.input_nr + INCREMENTOR))

Теперь, скажем, я хочу смоделировать значение INCREMENTOR в моих тестах, равное 1. Если я сделаю это:

from subprocess import call
from unittest import mock

def test_increments_with_1():
    with mock.patch('so_script.INCREMENTOR', 1):
        call(['python', 'so_script.py', '3'])
    with open('test.txt', 'r+') as f:
        assert f.read() == '4'

Тест не пройден, поскольку значение INCREMENTOR остается равным 4, хотя я попытался исправить его до 1. Итак, в файл записывается 7 вместо 4.

Итак, мой вопрос: как мне смоделировать глобальную переменную INCREMENTOR в моем файле so_script.py, чтобы при вызове subprocess.call() он оставался поддельным?

1 Ответ

0 голосов
/ 26 ноября 2018

Так как сценарий so_script.py и pytest выполняются в разных процессах, нельзя смоделировать объекты в so_script.py, пока последний вызывается в тестах как другой процесс.

Лучшее решение, которое я нашел, состояло в том, чтобы поместить все элементы из блока if __name__ == '__main__: в функцию и протестировать эту функцию с помощью Pytest, высмеивая все, что мне нужно было. И, чтобы обеспечить 100% тестовое покрытие (что было моим первоначальным намерением вызвать скрипт как подпроцесс), я применил это решение .

Поэтому я отказался от использования subprocess.call() в своих тестах и ​​написал init() функцию проверки if __name__ == '__main__:, а затем высмеял __name__ в тестах для проверки функции, как и советует статья. Это дало мне 100% тестовое покрытие и полные возможности для насмешек.

...