Макет Попена с помощью pytest-mock

У меня есть модуль Python, содержащий следующие строки

import subprocess

# command that write things to a file in a specific location
command = 'default_command'

def f():
    proc = subprocess.Popen(command, ..some_args..)
    status_code = proc.wait()
    error_code = proc.stderr.read()
    # some stuff with status_code, error_code and the content of the file

При нормальном выполнении command записывает данные в файл и возвращает код выхода.

Я хочу написать модульный тест для этой функции с pytest и pytest-mock, который должен имитировать command, который я выполняю с Popen. Мне нужно издеваться над этой командой, потому что она дает не очень предсказуемый результат. Макет должен делать две вещи:

  • Напишите предсказуемый вывод в файл
  • Вернуть конкретный код выхода и / или код ошибки

Как этого добиться?

Пожалуйста, дайте мне знать, даже если вы думаете, что я неправильно отношусь к этому.

it has some not-well predictable output, то программа command будет тесетом, зачем тестировать f()? Если вы заинтересованы в тестировании кода выхода, связанного с ..some_args.., то это отдельная история, или интерес только в синтаксическом анализе выходного файла.
Gang 21.04.2018 18:05

Потому что f() - это оболочка Python для другой программы. Мне нужно протестировать оболочку Python, а не другую программу

ceccoemi 21.04.2018 18:09

Я бы выбрал mocker.patch('subprocess.Popen), wait() и read(), получил бы тестовую функцию для записи ожидаемого результата, но не уверен, что он даже близок к тому, что вы ожидаете.

Gang 21.04.2018 18:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
427
0

Другие вопросы по теме